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

字符串的排列

时间:2016-06-24 15:48:09      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

题目

输入一个字符串,按字典序打印出该字符串中字符的所有排列。
例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

解题

把一个字符串看成两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。求整个字符串的排列,分为两步:
第一步:求所有可能出现在第一个位置的字符,即把第一个字符和后面的所有字符交换
第二步:固定第一个字符,求后面所有字符的排列,这个时候扔把后面的所有字符看成两个部分:后面字符的第一个字符,以及这个字符之后的所有字符,这是一个递归的过程。

核心程序

for(int i = start;i<chars.length;i++){
            // 交换
            swap(chars,start,i);
            // 递归
            Permutation(chars,start+1,set);
            // 换回去
            swap(chars,start,i);
        }

从start位置开始与后面(包括start)的所有位置互换
互换后进行递归,注意递归的起始位置是start+1,而不是i+1,下次递归是下一个位置和后面的所有位置进行互换。
最后要回溯,换回去

import java.util.ArrayList;
import java.util.*;
public class Solution {
    public ArrayList<String> Permutation(String str) {
       ArrayList<String> result = new ArrayList<String>();

       if(str == null || str.length()==0){
           return result;
       }
        Set<String> set = new TreeSet<String>();
        char array[] = str.toCharArray();

        Permutation(array,0,set);

        result.addAll(set);
        return result;
    }

      public void Permutation(char[] chars,int start,Set<String> set){

        if(start == chars.length -1 ){
            String p = String.valueOf(chars);
            set.add(p);
            return;
        }
        for(int i = start;i<chars.length;i++){
            // 交换
            swap(chars,start,i);
            // 递归
            Permutation(chars,start+1,set);
            // 换回去
            swap(chars,start,i);
        }

    }

    public void swap(char[] array,int i,int j){
        char tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}

字符串的排列

标签:

原文地址:http://blog.csdn.net/qunxingvip/article/details/51735720

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