使用Java中的堆栈对字符串进行排列

时间:2013-11-22 22:03:48

标签: java string permutation string-concatenation

我在弄清楚为什么我的代码不能正常工作时遇到了问题。代码应该将字符串压入堆栈。然后它会在字符串前面加上一个“+”符号。 (示例[+ dog]。接下来,它弹出堆栈。它将“+”符号右侧的字符一个接一个地移动到字符串的左侧(例如[d + og] [o + dg] [g + do]并将它们推入堆栈。 这一遍又一遍地重复,直到字符串的所有排列以加号结束(例如[dog +] [dgo +] [god +] [gdo +] [odg +] [ogd +]然后它会看到堆栈上的字符串是否有“+” “在最后签名,如果是,它会打印出来。 这是我的代码:

我遇到的问题是我最后的陈述。我不能让角色移动到“+”号的另一边。

import java.util.Scanner;
import java.util.Stack;
import java.util.*;
import java.lang.*;

public class string_Perm{

    public static void main(String[] args) {// this takes user input for a string and runs it through the program
        Scanner inputString = new Scanner(System.in);
        String userInput;
        System.out.print("Enter a String: ");
        userInput = inputString.next();
        // test print statement below
        //System.out.println(userInput);
        PermString(userInput);

    }
    public static void PermString(String userInput){
        Stack permStack = new Stack();
        permStack.push("+" + userInput);//this pushes the user input string onto the stack.                 
        // test print statement below
        //System.out.println(permStack);
        while(!permStack.isEmpty()){
            String currentItem = (permStack.pop().toString());// it then pops the top of the stack while the stack isn't empty.
            if(currentItem.endsWith("+")){
                currentItem.substring(0,currentItem.length()-1);// if the string ends with a +, you print the string without the + at the end
                System.out.println(currentItem);

            }
            else{// this else statement is where i am having trouble its supposed to split the string at the plus sign and then move each char one by one to infront of the "+" sign, then push it onto the stack.
                String[] charArray = currentItem.split("\\+");
                System.out.println(charArray[charArray.length-1]);
                for(int i = 0;i <= charArray.length; i++){
                    String getWord = charArray[charArray.length - 1];
                    String addWord = (charArray[i] + "+" + getWord.substring(0,i) + getWord.substring(i,0));
                    System.out.println(addWord);
                    permStack.push(addWord);

                }



            }



        }





    }



}

欢迎对此代码或不同方法进行任何更改。提前致谢。

1 个答案:

答案 0 :(得分:1)

您的索引存在问题。我的建议:

  1. for循环需要迭代charArray中第二个字符串的长度(charArray保存字符串而不是字符!)。
  2. 您可以使用Stringbuilder移除位置i处的角色,而不是执行两个getWord.substring()
  3. 以下是我对for循环中代码的建议:

    String[] charArray = currentItem.split("\\+");
    for(int i = 0; i < charArray[1].length(); i++){
       String getWord = charArray[charArray.length - 1];
       StringBuilder sb = new StringBuilder(getWord);
       String addWord = (getWord.charAt(i) + charArray[0] + "+" + sb.deleteCharAt(i).toString());
       System.out.println(addWord);
       permStack.push(addWord);
    
    }
    

    试试这个,让我知道这是不是你想要的。