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