Java 关于获取返回置换数组的函数的难题
我想得到一个方法,它返回输入字符串的所有排列。我在互联网上搜索过,发现大多数代码与的代码相似: 但是,我想返回排列,而不是打印它们。 Robert Sedgewick的代码复制于此:Java 关于获取返回置换数组的函数的难题,java,algorithm,permutation,Java,Algorithm,Permutation,我想得到一个方法,它返回输入字符串的所有排列。我在互联网上搜索过,发现大多数代码与的代码相似: 但是,我想返回排列,而不是打印它们。 Robert Sedgewick的代码复制于此: public class Permutations { // print N! permutation of the characters of the string s (in order) public static void perm1(String s) { perm1("", s); }
public class Permutations {
// print N! permutation of the characters of the string s (in order)
public static void perm1(String s) { perm1("", s); }
private static void perm1(String prefix, String s) {
int N = s.length();
if (N == 0) System.out.println(prefix);
else {
for (int i = 0; i < N; i++)
perm1(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, N));
}
}
public static void main(String[] args) {
perm1("abcd");
}
}
公共类置换{
//打印N!字符串s的字符排列(按顺序)
公共静态void perm1(字符串s){perm1(“,s);}
私有静态void perm1(字符串前缀,字符串s){
int N=s.长度();
如果(N==0)System.out.println(前缀);
否则{
对于(int i=0;i
Robert Sedgewick的代码记录如下:
import java.util.ArrayList;
public class Test {
public static ArrayList<String> permute(String prefix, String s){
int len = s.length();
ArrayList<String> list = new ArrayList<String>();
if(s.length() == 0)
list.add(prefix);
else
for(int i = 0; i < len; i++)
permute(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len));
return list;
}
public static void main(String[] args) {
String str = "abcd";
ArrayList<String> array = permute("", str);
System.out.print(array.size());
}
}
import java.util.ArrayList;
公开课考试{
公共静态ArrayList排列(字符串前缀,字符串s){
int len=s.length();
ArrayList=新建ArrayList();
如果(s.length()==0)
列表。添加(前缀);
其他的
对于(int i=0;i
但是我的代码没有返回排列。它什么也不返回。我不知道为什么。谁能帮助我?您需要将排列方法的结果添加到arraylist中:
import java.util.ArrayList;
public class Test {
public static ArrayList<String> permute(String prefix, String s){
int len = s.length();
ArrayList<String> list = new ArrayList<String>();
if(s.length() == 0)
list.add(prefix);
else
for(int i = 0; i < len; i++)
list.addAll(permute(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len)));
return list;
}
public static void main(String[] args) {
String str = "abcd";
ArrayList<String> array = permute("", str);
System.out.print(array.size());
}
}
import java.util.ArrayList;
公开课考试{
公共静态ArrayList排列(字符串前缀,字符串s){
int len=s.length();
ArrayList=新建ArrayList();
如果(s.length()==0)
列表。添加(前缀);
其他的
对于(int i=0;i
您需要将permute方法的结果添加到arraylist中:
import java.util.ArrayList;
public class Test {
public static ArrayList<String> permute(String prefix, String s){
int len = s.length();
ArrayList<String> list = new ArrayList<String>();
if(s.length() == 0)
list.add(prefix);
else
for(int i = 0; i < len; i++)
list.addAll(permute(prefix + s.charAt(i), s.substring(0, i) + s.substring(i+1, len)));
return list;
}
public static void main(String[] args) {
String str = "abcd";
ArrayList<String> array = permute("", str);
System.out.print(array.size());
}
}
import java.util.ArrayList;
公开课考试{
公共静态ArrayList排列(字符串前缀,字符串s){
int len=s.length();
ArrayList=新建ArrayList();
如果(s.length()==0)
列表。添加(前缀);
其他的
对于(int i=0;i
导入java.util.ArrayList;
公开课考试{
/**返回给定字符串的所有排列的列表*/
公共静态ArrayList排列(字符串s){
ArrayList accum=新的ArrayList();
排列(累计,“,s);
返回累计;
}
/**
*私人助手方法来做实际工作。
*
*@param accum累加器的结果。
*@param prefix当前前缀。
*@param s要排列的剩余字符串。
*/
私有静态void置换(ArrayList accum、字符串前缀、字符串s){
int len=s.length();
如果(s.length()==0)
累加(前缀);
其他的
对于(int i=0;i
导入java.util.ArrayList;
公开课考试{
/**返回给定字符串的所有排列的列表*/
公共静态ArrayList排列(字符串s){
ArrayList accum=新的ArrayList();
排列(累计,“,s);
返回累计;
}
/**
*私人助手方法来做实际工作。
*
*@param accum累加器的结果。
*@param prefix当前前缀。
*@param s要排列的剩余字符串。
*/
私有静态void置换(ArrayList accum、字符串前缀、字符串s){
int len=s.length();
如果(s.length()==0)
累加(前缀);
其他的
对于(int i=0;i
+1因为它用最小的改动解决了OP的问题,但我还是推荐它,因为它不会在每一步连接ArrayList
。@Dukeling-我同意,但我试着记住这不是,我只是想说明他哪里出错了。这正是你应该做的,但有效地这样做是解决问题的下一步(即使不是必需的)——我总是尝试比较解决方案的效率,并尝试在我自己和其他人的答案中提及更有效的解决方案(以链接到另一个答案、解释或一些代码的形式)。记住,超越和超越是一个可接受的答案和一个好的/伟大的答案之间的区别。马库斯的答案更好,但你的答案更好。@Dukeling,你好,非常感谢。我对ArrayList、LinkedList和其他方法的速度非常感兴趣,我用ArrayList和LinkedList测试了这个案例,结果是ArrayList比LinkedList快得多