给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。
重复出现的子串要计算它们出现的次数。
示例 1 :
输入: “00110011”
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
请注意,一些重复出现的子串要计算它们出现的次数。
另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例 2 :
输入: “10101”
输出: 4
解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:
s.length 在1到50,000之间。
s 只包含“0”或“1”字符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-binary-substrings
【解答】
原创超时。。。
public int countBinarySubstrings(String s) {
if (s.length() <= 1) {
return 0;
}
char[] chars = s.toCharArray();
int count = 0;
boolean isZero = false;
int zeroCount = 0;
int oneCount = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == '0') {
isZero = true;
zeroCount++;
}else {
isZero = false;
oneCount++;
}
boolean tran = false;
for (int j = i+1; j < chars.length; j++){
if(isZero){
if (chars[j] == '0'){
zeroCount++;
}else if (!tran){
isZero = false;
tran = true;
oneCount++;
}else {
break;
}
}else {
if (chars[j] == '1'){
oneCount++;
}else if (!tran){
isZero = true;
tran = true;
zeroCount++;
}else {
break;
}
}
if (zeroCount == oneCount){
count++;
break;
}
}
zeroCount = 0;
oneCount = 0;
}
return count;
}
官方:我们可以将字符串 s 按照 0 和 1 的连续段分组,存在 counts 数组中,例如 s = 00111011,可以得到这样的 scounts 数组:counts={2,3,1,2}。遍历所有相邻的数对,求数对最小值的总和为答案
public int countBinarySubstrings1(String s) {
if (s.length() <= 1) {
return 0;
}
char[] chars = s.toCharArray();
List<Integer> counts = new ArrayList<>();
int index = 0, l = chars.length;
while (index < l){
int count = 1;
char c = chars[index++];
while (index < l && chars[index] == c){
count++;
index++;
}
counts.add(count);
}
if (counts.size() <= 1){
return 0;
}
int ans = 0;
for (int i = 1; i < counts.size(); i++){
ans+=Math.min(counts.get(i-1), counts.get(i));
}
return ans;
}
一次遍历
public int countBinarySubstrings2(String s) {
if (s.length() <= 1) {
return 0;
}
char[] chars = s.toCharArray();
int cur = chars[0];
int curCount = 1;
int preCount = 0;
int ans = 0;
for(int i = 1; i < chars.length;i++){
if (chars[i] == cur){
curCount++;
if (curCount <= preCount){
ans++;
}
}else {
preCount = curCount;
cur = chars[i];
curCount = 1;
ans++;
}
}
return ans;
}