Leetcode 5374:長さnの楽しい文字列の中で辞書順のk番目に小さい文字列
2271 ワード
タイトルの説明
「楽しい文字列」は次のように定義されます.は、小文字 は、 例えば、文字列「abc」、「ac」、「b」、「abcbabcbcb」は楽しい文字列ですが、「aa」、「baa」、「abababbc」は楽しい文字列ではありません.
2つの整数
ソート後のk番目の楽しい文字列を返してください.長さ
例1:
例2:
例3:
例4:
例5:
ヒント:
「楽しい文字列」は次のように定義されます.
['a', 'b', 'c']
のみを含む.1
からs.length - 1
の間のすべてのi
に対して、s[i] != s[i + 1]
を満たす(文字列の下付き文字は1から始まる).2つの整数
n
とk
をあげます.n
の長さのすべての楽しい文字列を辞書順にソートする必要があります.ソート後のk番目の楽しい文字列を返してください.長さ
n
の楽しい文字列がk
未満の場合は、空の文字列を返してください.例1:
:n = 1, k = 3
:"c"
: ["a", "b", "c"] 1 。 "c" 。
例2:
:n = 1, k = 4
:""
: 1 3 。
例3:
:n = 3, k = 9
:"cab"
: 3 12 ["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"] 。 9 "cab"
例4:
:n = 2, k = 7
:""
例5:
:n = 10, k = 100
:"abacbabacb"
ヒント:
1 <= n <= 10
1 <= k <= 100
class Solution {
public:
void dfs(int cur,int n,string str,int &curk,int k,string &ans){
if(cur >= n || curk > k){
if(cur == n){
if(++curk == k) ans = str;
}
return;
}
for(int j=0;j<3;++j){
char c = j+'a';
if(cur == 0 || cur>0&&c!=str[cur-1]){
str += c;
dfs(cur+1,n,str,curk,k,ans);
str.pop_back();
}
}
}
string getHappyString(int n, int k) {
string ans = "";
int curk = 0;
dfs(0,n,"",curk,k,ans);
return ans;
}
};