leetcode395 Longest Substring with At Least K Repeating Characters
阿新 • • 發佈:2018-09-09
++ ges 但是 使用 pan bbc 最長子串 gin false
思路:
尺取法。
循環i:1~26,分別計算恰好包含i種字母並且每種字母出現的次數大於等於k個的最長子串長度。
沒法直接使用尺取法,因為不滿足區間單調性,但是使用如上的方法卻是可以的,因為子串中包含的字母種類數是滿足區間單調性的。
實現:
1 #include <bits/stdc++.h> 2 using namespace std; 3 class Solution 4 { 5 public: 6 int longestSubstring(string s, int k) 7 { 8 int n = s.length(); 9if (k == 1) return n; 10 int ans = 0; 11 vector<int> num(26, 0); 12 for (int i = 1; i <= 26; i++) 13 { 14 fill(num.begin(), num.end(), 0); 15 int slow = 0, fast = 0, cnt = 0; 16 set<char> st; 17 while (fast < n)18 { 19 while (fast < n) 20 { 21 if (num[s[fast] - ‘a‘] == 0) cnt++; 22 num[s[fast] - ‘a‘]++; 23 st.insert(s[fast]); 24 fast++; 25 if (cnt == i && fast < n && num[s[fast] - ‘a‘] == 0) 26 break; 27 } 28 bool flg = true; 29 for (auto it: st) 30 if (num[it - ‘a‘] < k) { flg = false; break; } 31 if (flg) ans = max(ans, fast - slow); 32 if (fast == n) break; 33 while (slow < fast && cnt == i) 34 { 35 num[s[slow] - ‘a‘]--; 36 if (num[s[slow] - ‘a‘] == 0) { cnt--; st.erase(s[slow]); } 37 slow++; 38 } 39 } 40 } 41 return ans; 42 } 43 }; 44 int main() 45 { 46 string s = "aabbccdcccde"; int k = 2; 47 cout << Solution().longestSubstring(s, k) << endl; 48 return 0; 49 }
leetcode395 Longest Substring with At Least K Repeating Characters