2020年8月10日 计数二进制子串 countBinarySubstrings
class Solution {
public int countBinarySubstrings(String s) {
}
}
解题思路:
首先,要注意必须是连续的1和0才会记录。
返回的是出现的个数。
其实不难发现,如果有一个111000的连续相同子串,那么必定存在1100和10两个子串。那么也就是说只要出现了1和0的交换处,出现连续子串的个数就是较短的那一边的长度。
比如
11100100
1,出现连续的1有3个,之后转为0出现两个,那么相同的子串为2(较短的那个)
2,之后出现一个1,个数相同的子串为1
3,之后出现两个2,不过前面的长度为1,所以还是1
得到结果2+1+1=4
代码实现:
public int countBinarySubstrings(String s) {
char flag='0';
int oldlen=0;
int newlen=0;
int res=0;
for (int i=0;i<s.length();i++){
//如果连续,则记录长度增加
if (s.charAt(i)==flag){
newlen++;
}
//如果长度不一样,记录较小的值
else
{
res+=Integer.min(oldlen,newlen );
//标记重置
oldlen=newlen;
newlen=1;
flag=s.charAt(i);
}
}
res+=Integer.min(oldlen,newlen );
return res;
}