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: оптимизация
- Поскольку строки упорядочены обратно, так что мы просто использовали
String res
для записи , когдаidx == k
строка , когда вы можете.