(leetcode:696)
输入: “00110011”
输出: 6
解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。
#python写法
class Solution:
def countBinarySubstrings(self, s: str) -> int:
seq0, seq1 = 0, 1 #用来记录当前正在统计的0和1的数量
res = 0 #用来统计结果
for i in range(1, len(s)):
if s[i] == s[i-1]: #如果新字符和上一个相同,只需要修改1的统计数量
seq1 += 1
else: #如果和上一个字符不相同,则将0和1其中的小值加入结果,重置(和交换)0和1的统计数量
res += min(seq0, seq1)
seq0 = seq1
seq1 = 1
res += min(seq0, seq1)
return res
//js写法
var countBinarySubstrings = function(s) {
var seq0=0,seq1=1;
var res=0;
for (let i=1;i<s.length;i++){
if (s[i]===s[i-1]){
seq1+=1
} else {
res+=Math.min(seq0,seq1)
seq0=seq1
seq1=1
}
}
res+=Math.min(seq0,seq1)
return res
};
涉及的api:
- min()/Math.min()
思路和规律:
- 画图发现搜索的开始下标,一定是每一次都从前往后+1的
- 在匹配结束时改变匹配状态,只需要交换变量位置即可
- 状态改变的标志:s[i]!=s[i-1]
- 只在匹配完0,1的最长组合后,再检查其中的最小值计入结果