1、单vector存储(20ms,75%;14MB,24%)
1 int countBinarySubstrings(string s) { 2 vector<int>arr; 3 int len=s.size(); 4 int i=0; 5 6 //计算每一段0或1的长度,相邻必不同 7 while(i<len){ 8 int sum=0; 9 char ch=s[i]; 10 while(i<len&&s[i]==ch){ 11 sum++; 12 i++; 13 } 14 arr.push_back(sum); 15 } 16 17 int ins=0; 18 //连续两个长度中小的即为目标数 19 for(int i=0;i+1<arr.size();i++) 20 ins+=min(arr[i],arr[i+1]); 21 22 return ins; 23 }
2、last存储(20ms,75%;11.5MB,30%)
1 int countBinarySubstrings(string s) { 2 int ans = 0; 3 char last = ' '; 4 //pre保存0或1的长度,cur记录0或1暂时长度 5 int pre = 0; 6 int cur = 0; 7 8 /* “-”的作用在于帮助完成最后一轮循环, 9 * 因为该题的答案计算有一轮延迟 10 */ 11 s+="-"; 12 for (char c : s) { 13 if (last != c) { 14 last = c; 15 ans += min(pre, cur); 16 pre = cur; 17 cur = 0; 18 } 19 cur++; 20 } 21 return ans; 22 }
3、变量last存储(20ms,75%;10MB,80%)
1 int countBinarySubstrings(string s) { 2 int len=s.size(); 3 int ins=0; 4 int last=0; 5 int i=0; 6 7 //计算每一段0或1的长度,相邻必不同 8 while(i<len){ 9 int sum=0; 10 char ch=s[i]; 11 while(i<len&&s[i]==ch){ 12 sum++; 13 i++; 14 } 15 16 //连续两个长度中小的即为目标数 17 ins+=min(sum,last); 18 last=sum; 19 } 20 return ins; 21 }