27、字符串的排列

一、题目

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

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

二、解法

基于回溯法:

 1 import java.util.ArrayList;
 2 import java.util.Collections;
 3 public class Solution {
 4     public ArrayList<String> Permutation(String str) {
 5         ArrayList<String> res = new ArrayList<String>();
 6            if(str != null && str.length() > 0){
 7                PermutationHelper(str.toCharArray(),0,res);
 8                Collections.sort(res);
 9            }
10            return res;
11     }
12     //递归实现
13     private static void PermutationHelper(char[] cs, int i, ArrayList<String> list) {
14         if(i == cs.length-1){
15             //解空间的一个叶子结点
16             String val = String.valueOf(cs);
17             if (!list.contains(val))
18                 list.add(val);
19         }else{
20             for(int j = i; j < cs.length; ++j){
21                 swap(cs,i,j);
22                 PermutationHelper(cs, i+1, list);
23                 swap(cs,i,j);
24             }
25         }
26     }
27      public static void swap(char[] cs, int i, int j) {
28          char temp = cs[i];
29          cs[i] = cs[j];
30          cs[j] = temp;
31      }
32 }

 

posted @ 2017-08-30 14:49  fankongkong  阅读(151)  评论(0编辑  收藏  举报