1.タイトルの説明
幸せな文字列とは、次のような文字列です。
セットの文字のみで構成される['a'、 'b'、 'c']。
s [i]!= s [i + 1] 1からs.length-1までのiのすべての値(文字列は1インデックス付き)。
たとえば、文字列「abc」、「ac」、「b」、「abcbabcbcb」はすべて幸せな文字列であり、文字列「aa」、「baa」、「ababbc」は幸せな文字列ではありません。
2つの整数nとkが与えられた場合、辞書式順序でソートされた長さnのすべての幸せな文字列のリストを考えます。
このリストのk番目の文字列を返すか、長さがnのk未満の幸せな文字列がある場合は空の文字列を返します。
Input: n = 3, k = 9
Output: "cab"
Explanation: There are 12 different happy string of length 3
["aba", "abc", "aca", "acb", "bab", "bac", "bca", "bcb", "cab", "cac", "cba", "cbc"].
You will find the 9th string = "cab"
第二に、解決策
方法1:バックトラッキング
- ここにaba
abc ...
各再帰の前に、現在使用可能な文字が最後の文字と等しいかどうかを判断します。
- それらが同じでない場合は、文字列の最後に追加できます。
- それ以外の場合は、スキップして次の文字の列挙を続行します。
本質的に、それは拡張されたアプリケーションの完全な配列です...
不明なエラー:何が問題なのかわかりません。見つかった文字列の数は常にk未満です。
int n;
List<String> list;
StringBuilder sb;
private void dfs(char pre) {
if (sb.length() == n) {
System.out.println(sb.toString());
list.add(new String(sb.toString()));
return;
}
for (char c = 'a'; c <= 'c'; c++) {
if (c == pre && sb.length() > 0)
continue;
sb.append(c);
dfs(c);
sb.deleteCharAt(sb.length()-1);
}
}
public String getHappyString(int n, int k) { //返回所有长度为n的第k个happy字符
this.n = n;
list = new ArrayList<>();
sb = new StringBuilder("a");
dfs('a');
if (list.size() < k)
return "";
//Collections.sort(list);
return list.get(k-1);
}
コードを修正する...
List<String> l;
private void dfs(int n, String s) {
if (n == 0) {
l.add(s);
return;
}
for (char c = 'a'; c <= 'c'; c++) {
if (s.length() > 0 && s.charAt(s.length()-1) == c) {
continue;
}
dfs(n-1, s+c);
}
}
public String getHappyString(int n, int k) {
l = new ArrayList<>();
dfs(n, "");
if (l.size() < k)
return "";
return l.get(k-1);
}
複雑さの分析
- 時間の複雑さ: 、
- スペースの複雑さ: 、
方法2:最適化
- 文字列はバックアウト順序付けられているので、私たちはちょうど使用
String res
レコードにするときidx == k
の文字列は、ときにすることができます。