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