题目地址:
https://leetcode.com/problems/split-a-string-in-balanced-strings/
给定一个长
n
n
n的字符串
s
s
s,恰好含
n
/
2
n/2
n/2个字符'L'
和
n
/
2
n/2
n/2个字符'R'
,题目保证
n
n
n是偶数。问其能分为最多多少个非空的,且两个字符个数相等的子串。
从左向右遍历,可以每次在剩余字符串里找到最短的符合条件的前缀,将其切出,再不断重复做。简单证明可以用反证法,如果这个前缀不切,那么在后面切,这个前缀的后面一段也满足条件,从而可以多切出一段,矛盾。代码如下:
class Solution {
public:
int balancedStringSplit(string s) {
int cnt[2]{0, 0}, res = 0;
for (char ch : s) {
(ch == 'R' ? cnt[0] : cnt[1])++;
if (cnt[0] == cnt[1]) res++;
}
return res;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。