【发布时间】:2017-10-24 01:35:16
【问题描述】:
这个问题来自Cracking the Coding Interview 6th Edition,问题V1.11。
以下代码打印所有长度为 k 的字符串,其中字符 是按顺序排列的。它通过生成所有长度的字符串来做到这一点 k 然后检查每个是否已排序。什么是运行时?
package QVI_11_Print_Sorted_Strings;
public class Question {
public static int numChars = 26;
public static void printSortedStrings(int remaining) {
printSortedStrings(remaining, "");
}
public static void printSortedStrings(int remaining, String prefix) {
if (remaining == 0) {
if (isInOrder(prefix)) {
System.out.println(prefix);
}
} else {
for (int i = 0; i < numChars; i++) {
char c = ithLetter(i);
printSortedStrings(remaining - 1, prefix + c);
}
}
}
public static boolean isInOrder(String s) {
for (int i = 1; i < s.length(); i++) {
int prev = ithLetter(s.charAt(i - 1));
int curr = ithLetter(s.charAt(i));
if (prev > curr) {
return false;
}
}
return true;
}
public static char ithLetter(int i) {
return (char) (((int) 'a') + i);
}
public static void main(String[] args) {
printSortedStrings(5);
}
}
答案是 O(k c^k),其中 k 是字符串的长度,c 是 字母表中的字符数。需要 O(c^k) 时间 生成每个字符串。然后,我们需要检查这些中的每一个是否 已排序,需要 O(k) 时间。
现在,我了解 O(k) 的来源,但我不明白 O(c^k) 的来源。
【问题讨论】:
标签: java string algorithm recursion big-o