【问题标题】:Permutations of a string字符串的排列
【发布时间】:2011-06-24 10:04:01
【问题描述】:
public class Permute {
    public static void main(String[] args) throws IOException {
        System.out.println("Enter a string");
        BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
        String text = bufReader.readLine();
        shuffle("",text);
    }
    public static void shuffle(String dummy, String input){
        if(input.length() <= 1)
            System.out.println(dummy+input);
        else{
            for(int i=0; i <input.length();i++){
                input = input.substring(i,1) + input.substring(0,i) + input.substring(i+1);
                shuffle(dummy+input.substring(0,1),input.substring(1));
            }           
        }
    }
}

我正在尝试打印输入的字符串的所有排列。而且我真的无法猜测哪里出了问题,因为在纸上我发现这正在执行。到底哪里出了问题。

【问题讨论】:

  • 您是否尝试使用调试器单步执行您的代码,以查看其行为与您预期的不同之处?
  • 你怎么知道你错了?那里可能有线索...
  • 对 dummy+input.substring(0,1) 和 input.substring(1) 使用变量,看看你是否可以命名它们以匹配它们应该是什么。
  • 是的,我正在这样做,我正在逐步执行代码。
  • @Chaitanya:好的。所以在某些时候,你应该能够看到它做一些意想不到的事情......

标签: java recursion permutation


【解决方案1】:

尝试改变你的随机播放:

public static void shuffle(String dummy, String input){
    if(input.length() <= 1)
        System.out.println(dummy+input);
    else{
        for(int i=0; i <input.length();i++){
           shuffle(dummy+input.charAt(i), input.substring(0, i) + input.substring(i+1, input.length()));
        }           
    }
}

【讨论】:

    【解决方案2】:
    public class Permute {
        public static void main(String[] args) throws IOException {
            System.out.println("Enter a string");
            BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
            String text = bufReader.readLine();
            shuffle("",text);
        }
        public static void shuffle(String dummy, String input){
            if(input.length() <= 1)
                System.out.println(dummy+input);
            else{
                for(int i=0; i <input.length();i++){
                    input = input.substring(i,i+1) + input.substring(0,i) + input.substring(i+1);
                    shuffle(dummy+input.substring(0,1),input.substring(1));
                }           
            }
        }
    }
    

    应该是 input.substring(i,i+1) 而不是 input.substring(i,1)。因为每次我只需要 1 个字符保持不变,即在字符串的开头,其他字符必须混乱。

    错误是我假定子字符串的功能是子字符串(beginIndex,长度)。但它是子字符串(beginIndex,endIndex)。

    @Oli:谢谢你的帮助。

    【讨论】:

      【解决方案3】:

      因为这看起来像是我曾经做过的家庭作业,所以我会在这里帮助你。您将需要两个循环,一个在另一个内部。

      for(int i;i<something;i++)  
          for(int j;j<somethingElse;j++)
      

      这将使您能够生成所需的排列。

      【讨论】:

      • 根据OP不需要递归。此外,任何递归解决方案都可以展开为迭代版本。此外,OP 正在努力寻找问题所在。
      • 建议一个完全不同的结构(根本没有任何细节)并不是很有帮助!
      • @Oli 对于学生来说,他们必须先了解迭代,然后才能了解递归。那至少是我的2美分。还有,我为什么要给家庭作业一个完整的答案?
      • 给出完整的解决方案和完全不给出细节之间存在相当大的差距。 OP 正在尝试调试他/她的递归方法;您的回答对此有何帮助?
      【解决方案4】:

      for 循环中的两行替换为以下内容:

       String partString = input.substring(0, i) + input.substring(i + 1);
       shuffle(dummy + input.charAt(i), partString);
      

      既然这看起来像你的作业,我会让你弄清楚。如果没有,稍后会发布解释(回到我的日常工作;))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-27
        • 2020-09-19
        相关资源
        最近更新 更多