zoukankan      html  css  js  c++  java
  • 剑指offer_输入一个字符串,按字典序打印出该字符串中字符的所有排列

    字符串的排列

    题目描述

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

    解题思路:

    1.列出所有字符串用递归求解。
    对于n个字符串的排列问题。如果能生成n - 1个元素的全部排列结果,就能生成n个元素的全部排列结果。
    以abc为例:

    F(String str ,int start ,int end)
    F(abc,start,end)=F(abc,start+1,end)+F(bac,start+1,end)+F(cba,start+1,end)
    F(abc,start,end)=abc (start==end)

    2.结果按字典顺序输出,这就用到了强大的TreeSet了,直接排好序。又因为题目中要求返回ArrayList类型,故将TreeSet中元素全部加入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;
            }
            char[] chars = str.toCharArray();
            TreeSet<String> res = new TreeSet<String>(); //用于排序输出
            getResult(chars,0,str.length()-1,res);
            result.addAll(res) ;//添加到ArrayList
            return result ;
        }
    
        public void getResult(char[] chars,int start,int end,TreeSet<String> res){
    
            if(start==end){
                res.add(String.valueOf(chars));
            }else{
                for(int i=start;i<=end;i++){
                    swap(chars,start,i);//换一位
                    getResult(chars,start+1,end,res);//递归
                    swap(chars,start,i);//换回来,保证下次换位是正确的
                }
            }
        }
    
        public void swap(char[] chars,int a,int b){
            if(a==b){//因为会出现原位置与原位置交换,直接空即可
    
            }else{
                char temp = chars[a];
                chars[a]=chars[b];
                chars[b]=temp;
            }
        }
    }
  • 相关阅读:
    Linux常用操作命令总结
    Centos7安装FastDFS教程
    Permutation Sequence
    Next Permutation
    Remove Element
    4Sum
    3Sum Closest
    3Sum
    Longest Consecutive Sequence
    Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/lingongheng/p/6444228.html
Copyright © 2011-2022 走看看