Computer >> Máy Tính >  >> Lập trình >> C ++

Chuỗi con dài nhất với K ký tự lặp lại ít nhất trong C ++


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