[バックトラック] B032_長さnの幸せな文字列の中で、辞書式順序がk番目に小さい文字列(バックトラック)

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 O(2 ^ n)
  • スペースの複雑さ: 2 O(2 ^ n)

方法2:最適化

  • 文字列はバックアウト順序付けられているので、私たちはちょうど使用String resレコードにするときidx == kの文字列は、ときにすることができます。

元の記事714件を公開 賞賛された199件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/105610372