LeetCode 696 Count Binary Substrings
(本人专注于刷leetcode全部题c#语言算法,后期发视频教程)
相信有些人看到这道题目的时候不会一下子明白。
首先解释一下题意:
理解/核心: 1、连续的 2、数量相等
图解: 一定要记住是连续的0和1,而不是0011 和1100 对比是一组结果。如下图:数量相等每一组结果都是偶数。
navy_master原创图片20180226
题目: 计数的二进制字符串的子串。
Give a string s
, count the number of non-empty (contiguous) substrings that have the same number of 0's and 1's, and all the 0's and all the 1's in these substrings are grouped consecutively.
(给一个字符串S,算非空数(连续的),有0和1的数目相同的子串,和所有0的和1的在这些子串组合连续。多次出现的计数次数发生的子串。)
Substrings that occur multiple times are counted the number of times they occur.
(多次出现的计数次数发生的子串。)
Example 1:
Input: "00110011" Output: 6 Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01". Notice that some of these substrings repeat and are counted the number of times they occur. Also, "00110011" is not a valid substring because all the 0's (and 1's) are not grouped together.
Note:
s.length
will be between 1 and 50,000.s
will only consist of "0" or "1" characters.
可以把字符串s转化为0和1的堆。譬如,“11001100”转化为“2222 ”
c#版高效答案:
static void Main(string[] args)
{
string var = "00110011";
int num = GetNum(var);
Console.WriteLine(num);
Console.ReadKey();
}
private static int GetNum(string s)
{
int len = s.Length;
if (len <= 1) return 0;
char[] sc = s.ToCharArray();
int[] count = new int[len];
int tmp = 0;
for (int i = 0; i < len-1; i++)
{
count[tmp]++;
if (sc[i] != sc[i + 1])
tmp++;
}
if (sc[len-1]==sc[len-2])
count[tmp]++;
else
count[tmp]++;
int res = 0;
for (int i = 0; i < tmp; i++)
{
res += Math.Min(count[i], count[i + 1]);
}
return res;
}
java经典答案: http://blog.csdn.net/liuchonge/article/details/78452948
如果对答案有异议,欢迎各路大神指点,并在评论区留下c#代码,相互学习。