给你一个长度为 n 的字符串 s ,和一个整数 k 。请你找出字符串 s 中 重复 k 次的 最长子序列 。
子序列 是由其他字符串删除某些(或不删除)字符派生而来的一个字符串。
如果 seq * k 是 s 的一个子序列,其中 seq * k 表示一个由 seq 串联 k 次构造的字符串,那么就称 seq 是字符串 s 中一个 重复 k 次 的子序列。
举个例子,"bba" 是字符串 "bababcba" 中的一个重复 2 次的子序列,因为字符串 "bbabba" 是由 "bba" 串联 2 次构造的,而 "bbabba" 是字符串 "bababcba" 的一个子序列。
返回字符串 s 中 重复 k 次的最长子序列 。如果存在多个满足的子序列,则返回 字典序最大 的那个。如果不存在这样的子序列,返回一个 空 字符串。
示例 1:
输入:s = "letsleetcode", k = 2
输出:"let"
解释:存在两个最长子序列重复 2 次:let" 和 "ete" 。
"let" 是其中字典序最大的一个。
示例 2:
输入:s = "bb", k = 2
输出:"b"
解释:重复 2 次的最长子序列是 "b" 。
示例 3:
输入:s = "ab", k = 2
输出:""
解释:不存在重复 2 次的最长子序列。返回空字符串。
示例 4:
输入:s = "bbabbabbbbabaababab", k = 3
输出:"bbbb"
解释:在 "bbabbabbbbabaababab" 中重复 3 次的最长子序列是 "bbbb" 。
提示:
n == s.length
2 <= k <= 2000
2 <= n < k * 8
s
由小写英文字母组成
链接:https://leetcode-cn.com/problems/longest-subsequence-repeated-k-times
解法:
这题正向思考,直接求解重复k次的最长子串根本无从下手,看了别人的题解才知道这题需要注意2 <= n < k * 8,说明满足条件的最长子串长度不超过7.子串由小写字母组成,那么我们就可以对26个字母选1-7个进行全排列,每次排列完的字符串都需要检验是否满足在s中
重复k次。直接求解难,但检验还是简单的。本题数据范围小,所以可以这么做。
class Solution {
bool check(string &s, string &cur, const int &k)
{
int cnt=0; //重复次数
int i=0;
int len=cur.size();
for(auto &ss:s)
{
if(ss==cur[i])
++i;
if(i==len)
{
i=0;
++cnt;
if(cnt==k)
return true;
}
}
return false;
}
public:
string longestSubsequenceRepeatedK(string s, int k) {
vector<vector<string>> str(8);
str[0].push_back("");
for(int i=1;i<8;++i) //i表示长度
{
for(auto &ss:str[i-1]) //在长度为i-1的基础上进行添加
{
for(int j=0;j<=26;++j) //‘a’-‘z’
{
string temp=ss+(char)(j+'a');
if(check(s, temp, k)) //检验
str[i].push_back(temp);
}
}
}
for(int i=7;i>=0;i--)
{
if(str[i].size()>0) //选择最长子串
{
return *(str[i].rbegin()); //选择字典序最大
}
}
return "";
}
};