牛客网 | 字符串的排列

来源:互联网 发布:mac拷贝照片到u盘 编辑:程序博客网 时间:2024/05/22 09:49
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

对于一个n 位的字符串来讲,它是n-1位字符串的排列 加上 没有在 n -1 位字符串里 那个字符 的排列。 有点难理解,用例子说明:

对于字符串ABC来讲,它所有的排列就是 A + BC 的排列 加上 B + AC 的排列,再加上 C + AB的排列。

而BC的排列是 B + C 的排列 加上 C + B 的排列。

所以,对一个字符串,我们从中去一个值,然后求剩余部分的排列,然后把它们再组合在一起。

import java.util.ArrayList;import java.util.Collections;public class Solution {   public  ArrayList<String> Permutation(String str) {        ArrayList<String> list = new ArrayList<>();        if (str == null || str.length() == 0) {            return list;        }        per(str.toCharArray(),0,str.length(),list);        Collections.sort(list);        return list;    }    public  void per(char[] str,int start,int size,ArrayList<String> list)    {        if(start == size)            list.add(new String(str));        else        {            for (int i = start; i < size; i++) {                if(i!=start&&str[i]==str[start])                    continue;                else                {                    swap(str, i, start);                    per(str,start+1,size,list);                    swap(str,start,i);                }            }        }    }    public  void swap(char[] str,int index1,int index2)    {        if(index1!=index2)        {            char temp = str[index1];            str[index1] = str[index2];            str[index2] = temp;        }    }}


0 0
原创粉丝点击