首页 文章资讯内容详情

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

2026-06-05 1 花语

假设我们有一个字符串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