输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
1 # -*- coding:utf-8 -*- 2 class Solution: 3 def backTrack(self,ss,k,result,temp,n): 4 if k >= n: 5 result.add(''.join(temp[:])) 6 return 7 for i in range(len(ss)): 8 temp.append(ss[i]) 9 self.backTrack(ss[:i]+ss[i+1:],k+1,result,temp,n) 10 temp.pop(-1) 11 12 def Permutation(self, ss): 13 n = len(ss) 14 if n == 0: 15 return [] 16 result = set() 17 temp = [] 18 self.backTrack(ss,0,result,temp,n) 19 return list(sorted(result)) 20 # write code here
Java版本代码,leetcode地址:
1 class Solution { 2 public void backTrack(String ss,int k,HashSet<String> result,ArrayList<String> temp,int n) { 3 if(k >= n) { 4 StringBuilder sBuilder = new StringBuilder(); 5 for(String s: temp) { 6 sBuilder.append(s); 7 } 8 result.add(sBuilder.toString()); 9 } 10 for(int i = 0;i < ss.length();i++) { 11 temp.add(ss.charAt(i)+""); 12 String part1 = ss.substring(0, i); 13 String part2 = ss.substring(i+1,ss.length()); 14 backTrack(part1+part2, k+1, result, temp, n); 15 temp.remove(temp.size()-1); 16 } 17 } 18 public String[] permutation(String s) { 19 int n = s.length(); 20 if(n==0) { 21 return new String[0]; 22 } 23 HashSet<String> resultHashSet = new HashSet<>(); 24 ArrayList<String> temp = new ArrayList<String>(); 25 backTrack(s,0,resultHashSet,temp,n); 26 return resultHashSet.toArray(new String[0]); 27 } 28 }
思路:回溯法,全排列。
因为字符串中可能包含重复的字母,而最终结果要去重,因此需要使用Set数据结构。