码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-06 22:05:46      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:toc   int   题目   reverse   log   情况   new   代码   swa   

题目描述:

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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;
    }
}

 

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

标签:toc   int   题目   reverse   log   情况   new   代码   swa   

原文地址:http://www.cnblogs.com/weekend/p/7128444.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!