【字符串】696. 计数二进制子串

题目:

解答:

方法一:

本题的思路和前面的 647. 回文子串的思路相同, 找到每一个满足当前字符和前一个字符组合起来为 '01' 或者 '10' 的字符位置, 然后向前后进行扩展. 本题条件中也需要统计重复出现的字符串个数, 即位置不同的也需要统计, 所以跟前面的题目意思相同

 1 class Solution {
 2 public:
 3     int count = 0;
 4 
 5     int countBinarySubstrings(string s) 
 6     {
 7         for (int i = 1; i < s.size(); i++)
 8         {
 9             // 出现'01'的情况
10             if (s[i-1] == '0' && s[i] == '1')
11             {
12                 BinarySubstring(s, i-1, i);
13             }
14             // 出现'10'的情况
15             if (s[i-1] == '1' && s[i] == '0')
16             {
17                 BinarySubstring(s, i-1, i);
18             }
19         }
20         return count;
21     }
22 
23     void BinarySubstring(string s, int start, int end)
24     {
25         char f = s[start];
26         char e = s[end];
27         while (start >= 0 && end < s.size() && s[start] == f && s[end] == e)
28         {
29             start--;
30             end++;
31             count++;
32         }
33     }
34 };

方法一超时了。

方法二:

 1 class Solution {
 2 public:
 3  
 4     int countBinarySubstrings(string s) 
 5     {
 6         int ans=0;
 7 
 8         for(int i=0; i<s.size()-1;i++)
 9         {
10             //从前往后遍历
11             if(s[i]!=s[i+1])
12             {
13                 //发现0,1相邻,开始向两边扩张
14                 int left=i;
15                 int right=i+1;
16                 while(left>0 && right<s.size()-1)
17                 {
18                     //当扩张到下一个0,1相邻和边界时跳出
19                     if((s[left]!=s[left-1]) || (s[right]!=s[right+1]))
20                     {
21                         break;
22                     }
23                     left--;
24                     right++;
25                 }
26                 ans += right-i; //此时符合条件的数量为长度的一半
27                 i = right-1; //直接跳到下一个
28             }
29         }
30         return ans;
31     }
32 };

猜你喜欢

转载自www.cnblogs.com/ocpc/p/12823467.html
今日推荐