1. 題目來源
2. 題目說明
3. 題目解析
方法一:暴力+常規解法
數據範圍很小,完全可以進行暴力求解,並且對於 的暴力求解也是可以滿足的。思路如下:
- 遍歷字符串,將原字符串分割爲左右子串進行分別統計
- 注意要保證左右子串都需要存在,所以注意第一層循環的邊界情況需要考慮清楚
- 統計左右子串的得分情況,每次取
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;
}
};
方法二:暴力優化+常規解法
對於該問題可以以 的暴力方式進行求解。思路如下:
- 遍歷字符串,統計字符串所有出現過的字符
1
,記爲total
- 順序遍歷字符串,設置全局變量
tmp
用以統計左子串所出現的所有字符1
- 此時得分就是
total - tmp
記爲右子串出現的字符1
,同時該字符串僅有0
、1
,所以左子串不爲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;
}
};