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的i
- 如果c[s[i] – ‘a’] = -1,则c[s[i] – ‘a’] := 1,否则将c[s[i] – ‘a’]加1。
- badChar := ‘*’
- 对于范围0到25的i
- 如果c[i]不等于-1且c[i]小于k,则badChar := i + ‘a’并退出循环。
- 如果badChar = ‘*’,则返回n。
- v := 通过使用badChar分割原始字符串而得到的另一个字符串数组。
- ans := 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
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP