C ++中长度为n的所有快乐字符串的第k个词法字符串
假设我们有一个字符串。当i的所有值(从1到长度为)仅由['a','b','c']个字母和s [i]!= s [i + 1]组成时,我们将称该字符串为快乐字符串s-1(此处字符串为1索引)。
因此,如果我们有两个整数n和k,请考虑按字典顺序排序的所有长度为n的快乐字符串的列表。我们必须找到此列表的第k个字符串,或者如果少于k个长度为n的快乐字符串,则返回一个空字符串
因此,如果输入像n = 3且k = 9,那么输出将是“ cab”,有12个不同的快乐字符串,分别是[“ aba”,“ abc”,“ aca”,“ acb”, “ bab”,“ bac”,“ bca”,“ bcb”,“ cab”,“ cac”,“ cba”,“ cbc”],第9个是“ cab”。
为了解决这个问题,我们将遵循以下步骤-
定义数组ret
定义一个函数
solve()
,将用s进行初始化,用1进行初始化,如果l与x相同,则-
在ret的末尾插入s
返回
对于初始化i:= 0,当i <3时,更新(将i增加1),执行-
解(s + c [i],l +1)
如果s的最后一个元素不等于c [i],则-
从主要方法中,执行以下操作-
x:= n
如果n等于0,则-
返回空字符串
解决(“ a”)
解决(“ b”)
resolve(“ c”)
排序数组ret
返回(如果k> ret的大小,则为空白字符串,否则为ret [k-1])
例
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>using namespace std;
struct Cmp{
bool operator()(string& a, string& b) {
return !(a < b);
}
};
char c[3] = {'a', 'b', 'c'};
class Solution {
public:
vector<string> ret;
int x;
void solve(string s, int l = 1){
if (l == x) {
ret.push_back(s);
return;
}
for (int i = 0; i < 3; i++) {
if (s.back() != c[i]) {
solve(s + c[i], l + 1);
}
}
}
string getHappyString(int n, int k){
x = n;
if (n == 0)
return "";
solve("a");
solve("b");
solve("c");
sort(ret.begin(), ret.end());
return k > ret.size() ? "" : ret[k - 1];
}
};
main(){
Solution ob;
cout << (ob.getHappyString(3,9));
}
输入值
3,9
输出结果
cab
以上是 C ++中长度为n的所有快乐字符串的第k个词法字符串 的全部内容, 来源链接: utcz.com/z/352422.html