题目链接:LeetCode696
分析:开始看毫无头绪,看着上面写的简单,觉得自己好菜,看了一会之后,emmm,就这样搞,想到枚举i,j暴力判断i,j字串,然后看数据范围n<5e4,这o(n3)行的 ,那就只有o(n)的,就想个o(n)的,然后想到能不能遍历一遍完成,觉得可以,因为每次0,1交界处答案开始增加值,也就是从交界处向两边扩展直到两边不是01对为止。
题解的做法容易理解:
遍历字符串得到一个数组保存连续的1或者0的值
如00110011可以得到【2,2,2,2】
由于相邻的数字对答案的贡献是min(a[i],a[i+1]) 0<=i<n-1,所以
遍历得到的数组求和为ans
我的渣渣代码:
代码
class Solution {
public int countBinarySubstrings(String s) {
int n=s.length();
if(n==0)return 0;
int ans=0;
int[] cnt=new int[]{0,0};
for(int i=0;i<n;i++){
int j=s.charAt(i)-'0';
cnt[j]++;
if(i!=0&&s.charAt(i-1)!=s.charAt(i))cnt[j]=1;
if(cnt[(j+1)&1]>0){
cnt[(j+1)&1]--;
ans++;
}
}
return ans;
}
}