字符串的全排列问题

来源:互联网 发布:c语言三大应用领域 编辑:程序博客网 时间:2024/05/20 08:43
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。


方法一:

注意点:

  第一个是重复字母,第二个是按字典顺序。

  重复字母我们在进行交换的时候直接跳过就可以了,按字典顺序,这个就需要我们进行排列了。

思路

这个题不会做,
还是以例子:abc的形式来讲解此算法思路:
第一步:abc———->将第一个字符与自己本身还与其他的字符进行交换后得到abc、bac、cba。注:用一for循环即可实现。
第二步:在第一步每种情况的基础上,保持第一个字符不变,求剩余几位的排列。以bac为例:保持第一位不变,剩余两位ac的排列为:ac、ca(注:发现与第一步一样,因此用递归来实现)。直到保存到只剩下一个字符没有交换后加上前面的不变的字符作为输出结果,为:bac、bca。

package JianZhiOffer;
import java.util.Scanner;

public class Permutation
{
         public static void main(String[] args) {
                String str = "";
                  
                Scanner scan = new Scanner(System.in);
                  
                str = scan.nextLine();
                  
                permutation(str.toCharArray(), 0);
            }
          
            public static void permutation(char[] str, int i) {
                if (i >= str.length)
                    return;
                if (i == str.length - 1) {
                    System.out.println(String.valueOf(str));
                } else {
                    for (int j = i; j < str.length; j++) {
                        char temp = str[j];
                        str[j] = str[i];
                        str[i] = temp;
          
                        permutation(str, i + 1);
          
                        temp = str[j];
                        str[j] = str[i];
                        str[i] = temp;
                    }
                }
            }
    }

输入:abcd    

输出:
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc


方法2:

package JianZhiOffer;

public class Permutation1
{
    public static void main(String args[])
    {
    Permutation1 testPermutation=new Permutation1();
    testPermutation.permutation("abcd");
    }
    
    
    public void permutation(String str)
  {
    int count=0;
    if(str==null)
    return;
    char[] chs=str.toCharArray(); int point=0;
    System.out.print(chs);
    System.out.print(" ");
    count++; char temp1=chs[point];
    chs[point]=chs[++point]; chs[point]=temp1;
    while(!String.valueOf(chs).equals(str)){
    System.out.print(chs);
    System.out.print(" ");
    count++; if(point==chs.length-1){ char temp=chs[point]; chs[point]=chs[0];
    chs[0]=temp; point=0;
    }else{ char temp=chs[point]; chs[point]=chs[++point]; chs[point]=temp;
    }
    }
    System.out.println(count);
   }
}

输入:abcd      输出:abcd bacd bcad bcda acdb cadb cdab cdba adbc dabc dbac dbca 12

不过,方法2的输出结果不是按照字典顺序的,且不是全排列结果。