[LeetCode 周賽186] 1. 分割字符串的最大得分(暴力優化、常規解法)

1. 題目來源

鏈接:5392. 分割字符串的最大得分

2. 題目說明

在這裏插入圖片描述

3. 題目解析

方法一:暴力+常規解法

數據範圍很小,完全可以進行暴力求解,並且對於 O(n2)O(n^2) 的暴力求解也是可以滿足的。思路如下:

  • 遍歷字符串,將原字符串分割爲左右子串進行分別統計
  • 注意要保證左右子串都需要存在,所以注意第一層循環的邊界情況需要考慮清楚
  • 統計左右子串的得分情況,每次取 max 即可

這是很直觀的思路了,但是一開始卻在左右串都非空這個邊界情況上吃了虧…還是沒有考慮完善啊。

參見代碼如下:

// 執行用時 :12 ms, 在所有 C++ 提交中擊敗了100.00%的用戶
// 內存消耗 :6.3 MB, 在所有 C++ 提交中擊敗了100.00%的用戶

class Solution {
public:
    int maxScore(string s) {
        int mmax = -1;
        for (int i = 0; i < s.size() - 1; ++i) {
            int cnt = 0;
            for (int j = 0; j <= i; ++j) if (s[j] == '0') ++cnt;
            for (int k = s.size() - 1; k > i; --k) if (s[k] == '1') ++cnt;
            mmax = max(mmax, cnt);
        }
        return mmax;
    }
};

方法二:暴力優化+常規解法

對於該問題可以以 O(n)O(n) 的暴力方式進行求解。思路如下:

  • 遍歷字符串,統計字符串所有出現過的字符 1,記爲 total
  • 順序遍歷字符串,設置全局變量 tmp 用以統計左子串所出現的所有字符 1
  • 此時得分就是 total - tmp 記爲右子串出現的字符 1,同時該字符串僅有 01,所以左子串不爲 1 的就全是 0。即左串得分可表示爲 i + 1 - tmp,左右串相加可得總分
  • 每次遍歷取最大即可得到最大得分

簽到題思路簡單,但是這個邊界情況導致 wa 了 1 次,還是太馬虎了…

參見代碼如下:

// 執行用時 :0 ms, 在所有 C++ 提交中擊敗了100.00%的用戶
// 內存消耗 :6.4 MB, 在所有 C++ 提交中擊敗了100.00%的用戶

class Solution {
public:
    int maxScore(string s) {
        int total = 0, n = s.size(), ans = 0, tmp = 0;
        for (auto e : s) if (e == '1') ++total;
        for (int i = 0; i < n - 1; ++i) {
            if (s[i] == '1') ++tmp;
            int cur = total - tmp + i + 1 - tmp;
            ans = max(ans, cur);
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章