Giả sử chúng ta có một chuỗi s và chúng ta phải tìm độ dài của chuỗi con dài nhất T của chuỗi đã cho đó (chỉ bao gồm các chữ cái thường) sao cho mọi ký tự trong T xuất hiện không ít hơn k lần. Vì vậy, nếu chuỗi là "ababbc" và k =2, thì đầu ra sẽ là 3 và chuỗi con dài nhất sẽ là "ababb", vì có hai a và ba b.
Để giải quyết vấn đề này, chúng ta sẽ làm theo các bước sau -
- tạo một hàm đệ quy có tên là longSubstring (), hàm này nhận chuỗi s và kích thước k
- nếu k =1, thì trả về kích thước của chuỗi
- nếu kích thước của chuỗi
- tạo một mảng c có kích thước 26 và điền vào mảng này với -1
- n:=kích thước của chuỗi
- cho tôi trong phạm vi từ 0 đến n
- nếu c [s [i] - 'a'] =-1 thì c [s [i] - 'a']:=1, nếu không thì tăng c [s [i] - 'a'] lên 1
- badChar:=‘*’
- cho tôi trong phạm vi từ 0 đến 25
- nếu c [i] không phải là -1 và c [i]
- nếu badChar =‘*’, thì trả về n
- v:=một mảng chuỗi khác bằng cách tách chuỗi gốc bằng badChar
- ans:=0
- cho tôi trong phạm vi từ 0 đến kích thước của v
- ans:=max of ans và longSubstring (v [i], k)
- trả lại ans
Ví dụ (C ++)
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h> using namespace std; class Solution { public: vector <string> splitString(string s, char x){ string temp = ""; vector <string> res; for(int i = 0; i < s.size(); i++){ if(s[i] == x){ if(temp.size())res.push_back(temp); temp = ""; } else temp += s[i]; } if(temp.size())res.push_back(temp); return res; } int longestSubstring(string s, int k) { if(k == 1)return s.size(); if(s.size() < k )return 0; vector <int> cnt(26, -1); int n = s.size(); for(int i = 0; i < n; i++){ if(cnt[s[i] - 'a'] == -1) cnt[s[i] - 'a'] = 1; else cnt[s[i] - 'a']++; } char badChar = '*'; for(int i = 0; i < 26; i++){ if(cnt[i] != -1 && cnt[i] < k){ badChar = i + 'a'; break; } } if(badChar == '*')return n; vector <string> xx = splitString(s, badChar); int ans = 0; for(int i = 0; i < xx.size(); i++)ans = max(ans, longestSubstring(xx[i], k)); return ans; } }; main(){ Solution ob; cout << ob.longestSubstring("ababbc", 2); }
Đầu vào
"ababbc" 2
Đầu ra
5