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;
            }
        }
    }
  • 相关阅读:
    使用别名(CName)记录免费将顶级域名解析到动态IP上
    DataTable 排序
    VS2005中使用MySQL 5.0
    让VS2005用起来更顺手
    PowerBuilder 9.0 Datawindow 导出 pdf 文件
    使用WebClient自动填写并提交ASP.NET页面表单的源代码
    C#中使用条件运算符 (?:)
    如何申请 @msn.com 邮箱
    遇上你是我的缘[转]
    Linux也玩远程桌面(VNC)
  • 原文地址:https://www.cnblogs.com/lingongheng/p/6444228.html
Copyright © 2011-2022 走看看