C ++中具有至少K个重复字符的最长子字符串

假设我们有一个字符串s,并且必须找到该给定字符串的最长子字符串T的长度(仅由小写字母组成),以使T中的每个字符出现不少于k次。因此,如果字符串为“ ababbc”且k = 2,则输出为3,最长的子字符串为“ ababb”,因为有两个a和三个b。

为了解决这个问题,我们将遵循以下步骤-

  • 创建一个称为longestSubstring()的递归函数,它使用字符串s和大小k

  • 如果k = 1,则返回字符串的大小

  • 如果字符串的大小<k,则返回0

  • 创建一个大小为26的数组c,并用-1填充

  • n:=字符串的大小

  • 当我在0到n的范围内

    • 如果c [s [i] –'a'] = -1,则c [s [i] –'a']:= 1,否则c [s [i] –'a']增加1

  • badChar:='*'

  • 当我在0到25的范围内

    • 如果c [i]不为-1并且c [i] <k,则badChar:= i +'a'并从循环中出来

  • 如果badChar ='*',则返回n

  • v:=另一个字符串数组,使用badChar拆分原始字符串

  • 回答:= 0

  • 对于介于0到v大小的i

    • ans:= ans和longestSubstring(v [i],k)的最大值

  • 返回ans

例子(C ++)

让我们看下面的实现以更好地理解-

#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);
}

输入值

"ababbc"
2

输出结果

5