剑指Offer题目:字符串的排列

题目描述:

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

题目分析:

最简单的是使用字典序生成法,这样可以把有重复字符串的情况也考虑进去。

 

Java实现代码:

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    
    private ArrayList<String> res = new ArrayList<String>();
    
    public ArrayList<String> Permutation(String str) {
        int len = str.length();
        if(len == 0) return res;
        if(len == 1) {res.add(str); return res; }
        
        char [] seq = str.toCharArray();
        Arrays.sort(seq);
        res.add(String.valueOf(seq));
      
        while(true){
          int k = len-1; 
          
          while(k>=1 && seq[k-1]>=seq[k]){
              k--;
          }
          if(k == 0) break;
          k--;
         
          int l = k + 1;
          while(l<len && seq[l] > seq[k]){
              l++;
          }
          l--;
          swap(seq, k,l);
          reverse(seq, k+1);
          res.add(String.valueOf(seq));
            
        }
        
        return res;
       
    }
    
    
    public void reverse(char[] seq, int start){
        int len = seq.length;
        if(len == 0) return;
        
        for(int i=0; i< (len-start)>>1; ++i){
            int p = start + i;
            int q = len - i-1;
            if(p == q) return;
            swap(seq, p, q);
            
        }
        
    }
    
    public void swap(char[] seq, int a, int b){
        char temp = seq[a];
        seq[a] = seq[b];
        seq[b] = temp;
    }
}

 

posted @ 2017-07-06 21:31  VictorWei  阅读(204)  评论(0编辑  收藏  举报