• 剑指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;
            }
        }
    }
  • 相关阅读:
    解决nodejs使用yarn安装vue-cli提示'vue' 不是内部或外部命令
    转载——java synchronized详解
    转载——Java中this关键字和super关键字的使用
    转载—— JUnit单元测试教程(翻译自Java Code Geeks)
    Usage and Idioms——Use with Maven
    转载——JUnit 5 新特性
    Usage and Idioms——Categories
    转载——单元测试利器 JUnit 4
    Usage and Idioms——Test Fixtures
    深入JUnit源码之Rule
  • 原文地址:https://www.cnblogs.com/lingongheng/p/6444228.html
Copyright © 2020-2023  润新知