今日签到题,题目如下:
给定一个字符串
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”字符。
因为字串中需要的是连续的 0 和 1,所以可以先将原字符串按照 0 和 1 进行分组,只需要将长度依序存入一个整型列表 checkList 中。
然后遍历 checkList,两两组合,两个元素中的最小值,即为组合中满足条件的自字符串数量。
复杂度分析:
两次独立循环,时间复杂度为 O(N);
使用一个列表记录每一组的长度,空间复杂度为 O(M),M 为组数。
以下为自己提交的代码:
public class Solution {
public int CountBinarySubstrings(string s) {
List<int> checkList = new List<int>();
char lastNum = s[0];
int record = 0;
for (int i = 0;i < s.Length;i++)
{
if (s[i] == lastNum)
{
record++;
}
else
{
checkList.Add(record);
record = 1;
lastNum = s[i];
}
}
checkList.Add(record);
record = 0;
for(int i = 0;i<checkList.Count - 1;i++)
{
record += Math.Min(checkList[i],checkList[i+1]);
}
return record;
}
}