题目
给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
我的想法
就正常的双循环暴力求解,结果是“超时”。
题解的方法,可以很好的理解,可是自己想却想出来。
代码
我的“超时”
class Solution {
public:
int countBinarySubstrings(string s) {
int len = s.size();
int num = 0;
for (int i = 0;i < len-1;i++){
int flag_same = 1;
while(s[i]==s[i + flag_same]){
flag_same++;
if (i + flag_same>=len){
break;
}
}
if (flag_same==1){
num++;
}
else{
if (i + flag_same + flag_same-1>=len){
continue;
}
int flag = 1;
for (int j = 1;j<flag_same;j++){
if (s[i+flag_same]!=s[i+flag_same+j]){
flag = 0;
}
}
num = num + flag;
// int j = 1;
// while (s[i+flag_same]=s[i+flag_same+j]){
// j++;
// }
// if (j>=flag_same-1){
// num++;
// }
}
}
return num;
}
};
题解的思路
class Solution {
public:
int countBinarySubstrings(string s) {
int ptr = 0, n = s.size(), last = 0, ans = 0;
while (ptr < n) {
char c = s[ptr];
int count = 0;
while (ptr < n && s[ptr] == c) {
++ptr;
++count;
}
ans += min(count, last);
last = count;
}
return ans;
}
};
反思
对于二叉搜索树,如果对其进行中序遍历,得到的值序列是递增有序的。