0
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));
            }           
        }
    }
}

Am trying to print all the permutations of a string entered. And I really cannot guess where am going wrong because on paper I find that this executing. Where exactly am going wrong.

6
  • 2
    Did you try stepping through your code with a debugger to see where its behaviour diverged from what you expected? Commented Feb 9, 2011 at 20:31
  • How do you know you're going wrong? There might be a clue there ... Commented Feb 9, 2011 at 20:36
  • Use variable for dummy+input.substring(0,1) and input.substring(1) and see if you can name them to match what they should be. Commented Feb 9, 2011 at 20:36
  • Yes am doing that, I'm stepping through the code. Commented Feb 9, 2011 at 20:40
  • 1
    @Chaitanya: Ok. So at some point, you should be able to see it do something unexpected... Commented Feb 9, 2011 at 20:45

4 Answers 4

1

Try change your shuffle:

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()));
        }           
    }
}
Sign up to request clarification or add additional context in comments.

Comments

1
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));
            }           
        }
    }
}

It should be input.substring(i,i+1) instead of input.substring(i,1). Because each time I need only 1 character to be constant, which is at the beginning of the string and others have to be jumbled.

The bug was I presumed the functionality of substring to be substring(beginIndex, length). But it is substring(beginIndex,endIndex).

@Oli: Thank you for the help.

Comments

0

Since this seems like a homework assignment I once did I will help you out here. You will need two loops, one inside the other.

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

This will enable you to generate the permutations that are required.

4 Comments

It doesn't need to be recursive according to the OP. Also, any recursive solution can be unrolled into an iterative version. furthermore the OP is struggling to see where the issue is.
Suggesting an entirely different structure (without any specifics at all) is not really very helpful!
@Oli for a student they must understand iteration before they can understand recursion. That is my 2 cents at least. Also why would I give a full answer for a homework assignment?
There's quite a gap between giving a full solution and giving no details at all. The OP is trying to debug his/her recursive approach; how is your answer helping with that?
0

Replace two lines in the for loop with following:

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

Since this looks like your homework I will let you figure out. If not, will post explanation after a bit ( got to get back to my day job ;) )

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.