力扣696、計數二進位制子串
阿新 • • 發佈:2021-10-03
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 }