题目:
解答:
方法一:
本题的思路和前面的 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 };
原文:https://www.cnblogs.com/ocpc/p/12823467.html