题目链接:https://leetcode-cn.com/problems/count-binary-substrings/description/
题目:
给定一个字符串
s
,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数
示例一:
输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。 请注意,一些重复出现的子串要计算它们出现的次数。 另外,“00110011”不是有效的子串,因为所有的0(和1)没有组合在一起。
示例二:
输入: "10101" 输出: 4 解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。
注意:
s.length
在1到50,000之间。s
只包含“0”或“1”字符。
题目要求非空子字符串必须是相同的元素且连续的,所以可以得出 连续的相同元素最小个数即为其与相邻不同的元素所能组成的子串个数。我被我自己说的都蒙圈了,怎么说呢。比如11000,'1';的个数是2,'0'的个数是3,所以这一串所符合条件的子串个数为2,因为需要连续且个数相等,所以1 和 0 之间为对称轴,分别向外扩展。因此我们需要将连续的相同元素“压缩”,即统计出现的个数并记录到栈。
C 代码:
int countBinarySubstrings(char* s)
{
int total = 0,ct = 0;
int len = strlen(s);
int ar[50000] = {1};
for (int i = 0;i < len-1;i++)
{
if (s[i] != s[i+1])
{
ct++;
ar[ct] = 1;
}
else
ar[ct]++;
}
for (int j = 0;j < ct;j++)
total += (ar[j] < ar[j+1] ? ar[j] : ar[j+1]);
return total;
}
C++ :
class Solution {
public:
int countBinarySubstrings(string s) {
int* ar = new int[50000];
int count = 1;
int i = 0,j;
for (j = 1;j < s.size();j++)
{
if (s[j] == s[j-1])
count++;
else {
ar[i++] = count;
count = 1;
}
}
ar[i++] = count;
int sum = 0;
while (--i)
{
sum += min(ar[i],ar[i-1]);
}
delete []ar;
return sum;
}
};
谢谢。