1. 程式人生 > 其它 >力扣696、計數二進位制子串

力扣696、計數二進位制子串

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     }