Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归计算字符串的所有可能排列_Java_String_Recursion_Permutation - Fatal编程技术网

Java 递归计算字符串的所有可能排列

Java 递归计算字符串的所有可能排列,java,string,recursion,permutation,Java,String,Recursion,Permutation,我试图在Java中使用递归计算给定字符串的所有可能排列。然而,我不知道我的代码出了什么问题 这是我的算法: publicstaticarraylistcomputeablepermutations(stringstr){ ArrayList perms=新的ArrayList(); //基本情况 如果(str.length()==1) perms.add(str); 否则{ //在字符串上循环 对于(int i=0;i

我试图在Java中使用递归计算给定字符串的所有可能排列。然而,我不知道我的代码出了什么问题

这是我的算法:

publicstaticarraylistcomputeablepermutations(stringstr){
ArrayList perms=新的ArrayList();
//基本情况
如果(str.length()==1)
perms.add(str);
否则{
//在字符串上循环
对于(int i=0;i
有几个问题:

  • 下一行:
    String sub=str.substring(i+1,str.length())忽略第一个字符
  • 同一行还将索引
    i
    之后的任何内容视为保持不变的子字符串“块”,而为了生成置换,我们应该在字符串其余部分的任意两个字符之间插入当前(第一个)字符,并对每个置换执行此操作
  • 线
    s=str.charAt(i)+s在#2中重复相同的错误
  • 下面是一个建议的修复方法:


    publicstaticarraylistcomputeablepermutations(stringstr){
    ArrayList perms=新的ArrayList();
    如果(str.length()==1){
    perms.add(str);
    }否则{
    字符串chr=str.substring(0,1);
    字符串rest=str.substring(1);
    ArrayList子项=计算所有可能项(rest);
    for(字符串s:子项){
    
    对于(int j=0;j,我建议使用
    Set perms=new HashSet();
    来避免重复的排列。使用
    ArrayList
    ,对于
    aaa
    等输入,您会得到6次相同的排列。如果您的输入可能多次包含相同的字符,您应该使用Set。这是否回答了您的问题?
    public static ArrayList<String> computeAllPossiblePermutations(String str) {
        ArrayList<String> perms = new ArrayList<>();
        if (str.length() == 1) {
            perms.add(str);
        } else {
            String chr = str.substring(0,1);
            String rest = str.substring(1);
            ArrayList<String> subPerms = computeAllPossiblePermutations(rest);
            for (String s : subPerms) {
                for (int j = 0; j <= s.length(); j++) {
                    String newPerm = s.substring(0,j) + chr + s.substring(j);
                    perms.add(newPerm);
                }
            }
        }
        return perms;
    }