1、题目
https://leetcode-cn.com/problems/count-binary-substrings/submissions/
2、题意
题解1:dp
dp[i]表示当前位置(包括自身)前面连续为’1’或’0’的个数
连续为‘1’个数为正,连续为‘0’个数为负
当前dp[i]数字等于总个数则 continue
否则当前abs(dp[i])<=abs(dp[i-abs(dp[i])]);res++;
class Solution {
public:
int countBinarySubstrings(string s) {
int res = 0,n = s.size();
vector<int> dp(n,0);
dp[0] = s[0]=='0'?-1:1;
for(int i=1;i<n;i++)
{
if(s[i]=='1')
dp[i] = s[i-1]==s[i]?dp[i-1]+1:1;
else
dp[i] = s[i]==s[i-1]?dp[i-1]-1:-1;
if(abs(dp[i])==i+1) continue;//当前dp[i]数字全部相同
res+=abs(dp[i])<=abs(dp[i-abs(dp[i])]);
}
return res;
}
};
题解2:空间O(1);
class Solution {
public:
int countBinarySubstrings(string s) {
int i = 0, n = s.size(), last = 0, res = 0;
while (i < n) {
char c = s[i];
int cnt = 0;
while (i < n && s[i] == c) {
i++;
cnt++;
}
res += min(cnt, last);
last = cnt;
}
return res;
}
};