[Backtracking] B032_Строка с k-м наименьшим лексикографическим порядком среди счастливых строк длины n (backtracking)

1. Название Описание

Счастливая строка - это строка, которая:

состоит только из букв множества ['a', 'b', 'c'].
s [i]! = s [i + 1] для всех значений i от 1 до s.length - 1 (строка индексируется 1).
Например, строки «abc», «ac», «b» и «abcbabcbcb» являются счастливыми строками, а строки «aa», «baa» и «ababbc» не являются счастливыми строками.

Для двух целых чисел n и k рассмотрим список всех счастливых строк длины n, отсортированных в лексикографическом порядке.

Вернуть k-ую строку этого списка или вернуть пустую строку, если имеется менее k счастливых строк длины n.

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: возвращение

  • аба а
    бк
    тут
    ...

Перед каждой рекурсией определите, равен ли текущий доступный символ последнему символу:

  • Если они не совпадают, их можно добавить в конец строки.
  • В противном случае пропустите и продолжайте перечислять следующий символ.

По сути, это полный набор расширенных приложений ...

Неизвестная ошибка: я не знаю, что не так, количество найденных строк всегда меньше 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 N ) O (2 ^ n)
  • Пространственная сложность: ( 2 N ) O (2 ^ n)

Способ 2: оптимизация

  • Поскольку строки упорядочены обратно, так что мы просто использовали String resдля записи , когда idx == kстрока , когда вы можете.

Опубликовано 714 оригинальных статей · Хвала 199 · 50 000+ просмотров

рекомендация

отblog.csdn.net/qq_43539599/article/details/105610372
рекомендация