【发布时间】:2020-12-17 11:26:52
【问题描述】:
我正在编写一个代码,用于递归地仅打印字符串的字典顺序较大的子字符串。
static ArrayList<String> getPermutations(String str) {
if (str.length() == 0) {
ArrayList<String> tempArrayList = new ArrayList<String>();
tempArrayList.add("");
return tempArrayList;
}
char currChar = str.charAt(0);
ArrayList<String> resultArrayList = new ArrayList<String>();
ArrayList<String> recResult = getPermutations(str.substring(1));
for (String j : recResult) {
for (int i = 0; i < str.length(); i++) {
resultArrayList.add(j.substring(0, i) + currChar + j.substring(i));
}
}
return resultArrayList;
}
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
ArrayList<String> al = getPermutations(str);
Collections.sort(al);
// System.out.println(al.toString());
int index = al.lastIndexOf(str);
while (index < al.size() - 1) {
System.out.println(al.get(index + 1));
index++;
}
}
代码运行良好。我在这里所做的是递归生成所有子字符串并同时将它们插入到 ArrayList 中。后来对该列表进行了排序,比较了字符串并完成了。
现在困扰我的是这个程序的复杂性。在这里,我生成所有子字符串,然后从中进行选择。对于递归,我觉得它是一种自动化过程,所有子字符串都必须至少创建或访问一次。 所以,在这一点上,我想问一下这是否可以像在递归函数中进行某种检查一样进行优化,以便只创建所需的子字符串(按字典顺序更大)。如果是,请详细说明在基于递归的解决方案的情况下如何考虑。
【问题讨论】:
-
您好!欢迎来到 Stackoverflow。您能否解释一下“字符串的字典顺序较大的子字符串”是什么意思?你可以举一个字符串的例子,以及它的字典上更大的子字符串。我很困惑,因为我假设在所有可能的子字符串中,必须有一个字典顺序最大的子字符串(两个字符串相等,或者一个大于另一个)。
-
当然。例如,“bac”的子字符串是“abc”、“acb”、“bac”、“bca”、“cab”和“cba”,但对于字典顺序较大或按字典顺序,只有子字符串“bca”、“ cab" 和 "cba" 将打印为 "bac" 作为输入。希望这可以澄清它。
标签: java recursion substring permutation lexicographic