27字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。



1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀)
2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
3)不断将每个元素放左第一个元素,然后将它作为前缀,并将其余元素继续全排列


abcd 将bcd 看成 m ->am 其中m 可以看成是 bm cm dm
同理: 将acd 看成 m ->bm

所以:
abcd 全排列就是am bm cm dm
对M 递归的算出全排列


 1 import java.util.ArrayList;
 2 import java.lang.StringBuffer;
 3 import java.util.concurrent.ConcurrentSkipListSet;
 4 import java.util.Set;
 5 public class Solution {
 6     private Set<String> result = new ConcurrentSkipListSet<String>();
 7     public ArrayList<String> Permutation(String str) {
 8           if(str.length() == 0){
 9             ArrayList<String> empty = new ArrayList<String>();
10             return empty;
11         }
12         char[] charArray = str.toCharArray();
13         fullperm(charArray, 0);
14         ArrayList<String> res = new ArrayList<String>(result);
15         return res;        
16     }
17     private void swap(char[] charArray,int start,int i){
18            char tmp = charArray[i];
19                 charArray[i] = charArray[start];
20                 charArray[start] = tmp;
21     }
22     private void fullperm(char[] charArray,int start ){
23         if(start==charArray.length-1){
24             StringBuffer sb = new StringBuffer();
25             for(char c  : charArray)
26                 sb.append(c);
27             result.add(sb.toString());
28             return;
29         }
30         for(int i=start;i<charArray.length;i++){                
31             swap(charArray,start, i);   
32             fullperm(charArray,start+1);
33             swap(charArray,start, i);
34         }
35     }
36 }

20180310

# -*- coding:utf-8 -*-
class Solution:

    def __init__(self):
        self.res = []

    def Permutation(self, ss):
        # write code here
        def swap(a,i,j):
            temp = a[i]
            a[i] = a[j]
            a[j] = temp
            
        def help(a,lo,hi):
            if(lo==hi):
                self.res.append(''.join(a))
            for i in range(lo,hi):
                if a[i] not in a[lo:i]:
                    swap(a,i,lo)
                    help(a,lo+1,hi)
                    swap(a,i,lo)
        if ss=='':
            return []
        ss = list(ss)
        help(ss,0,len(ss))
        return sorted(self.res)
原文地址:https://www.cnblogs.com/zle1992/p/7838992.html