用 n 表示字符串 s 的长度。对于每个 1 \le i < n,下标 i 是一个分割点,将字符串 s 分割成两个非空子字符串,左子字符串的下标范围是 [0, i - 1],右子字符串的下标范围是 [i, n - 1],分别计算左子字符串中的 0 的个数和右子字符串中的 1 的个数即可得到分割字符串的得分。遍历所有的分割点,即可得到分割字符串的最大得分。
[sol1-Python3]
1 2 3
classSolution: defmaxScore(self, s: str) -> int: returnmax(s[:i].count('0') + s[i:].count('1') for i inrange(1, len(s)))
当 1 \le i < n 时,分割点 i 将字符串 s 分割成两个非空子字符串,左子字符串的下标范围是 [0, i - 1],右子字符串的下标范围是 [i, n - 1]。对于 1 \le i < n - 1,当分割点从 i 移动到 i + 1 时,位于下标 i 处的字符 s[i] 从右子字符串中移除并添加到左子字符串中,分割字符串的得分变化如下:
由于最左侧的分割点是 i = 1,因此首先计算 i = 1 处的分割字符串的得分,然后从左到右依次遍历每个分割点,遍历过程中更新分割字符串的得分,遍历结束之后即可得到分割字符串的最大得分。
[sol2-Python3]
1 2 3 4 5 6 7
classSolution: defmaxScore(self, s: str) -> int: ans = score = (s[0] == '0') + s[1:].count('1') for c in s[1:-1]: score += 1if c == '0'else -1 ans = max(ans, score) return ans
publicclassSolution { publicintMaxScore(string s) { int score = 0; int n = s.Length; if (s[0] == '0') { score++; } for (int i = 1; i < n; i++) { if (s[i] == '1') { score++; } } int ans = score; for (int i = 1; i < n - 1; i++) { if (s[i] == '0') { score++; } else { score--; } ans = Math.Max(ans, score); } return ans; } }
classSolution { public: intmaxScore(string s){ int score = 0; int n = s.size(); if (s[0] == '0') { score++; } for (int i = 1; i < n; i++) { if (s[i] == '1') { score++; } } int ans = score; for (int i = 1; i < n - 1; i++) { if (s[i] == '0') { score++; } else { score--; } ans = max(ans, score); } return ans; } };
intmaxScore(char * s){ int score = 0; int n = strlen(s); if (s[0] == '0') { score++; } for (int i = 1; i < n; i++) { if (s[i] == '1') { score++; } } int ans = score; for (int i = 1; i < n - 1; i++) { if (s[i] == '0') { score++; } else { score--; } ans = MAX(ans, score); } return ans; }
var maxScore = function(s) { let score = 0; const n = s.length; if (s[0] === '0') { score++; } for (let i = 1; i < n; i++) { if (s[i] === '1') { score++; } } let ans = score; for (let i = 1; i < n - 1; i++) { if (s[i] == '0') { score++; } else { score--; } ans = Math.max(ans, score); } return ans; };
funcmaxScore(s string)int { score := int('1'-s[0]) + strings.Count(s[1:], "1") ans := score for _, c := range s[1 : len(s)-1] { if c == '0' { score++ } else { score-- } ans = max(ans, score) } return ans }
funcmax(a, b int)int { if b > a { return b } return a }