剑指offer 27:字符串的排列-- Java实现

剑指offer每日一题算法题(java解法)

方便日后复习,从今天开始。

算法之行始于足下

[编程题]字符串的排列-- Java实现

------------------------------------------------------------------------------------------------------
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
在这里插入图片描述

解题思路:
1.先把字符串转为数组,每次排列组合,我们只要算出所有路径即可,根据上图,可以,首先把首字母开头确定为3种,
2.每次循环,确定开头当A开头,第二个就为两种可能,同理B和C开头.
然后确定了一二个字母,最后一个就直接把值加在后面就行。

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();   //abc数组
        TreeSet<String> temp=new TreeSet<String>();
        Permutation(chars,0,temp);  //传一个数组和一个集合
        result.addAll(temp);
        return result;
    }
    public void Permutation(char[] chars,int begin,TreeSet<String> result){
         if(chars==null || chars.length==0 || begin<0 || begin>chars.length-1) { return ;}
        //当数组已经确定好顺序,比如AB,AC,BA,BC,CA,CB这种,剩下唯一值
        if(begin==chars.length-1){
            result.add(String.valueOf(chars));
        }else{
           //
             for(int i=begin ; i<=chars.length-1 ; i++) {
                 swap(chars,begin,i);  //进行第一个首字母确定
                 Permutation(chars, begin+1, result);   //begin加一进行重新传值
                 swap(chars,begin,i);   //进行第二个首字母确定
             }
        }
    }
    //交换位置
    public void swap(char[] chars,int a,int b){
        char t=chars[a];
        chars[a]=chars[b];
        chars[b]=t;
    }
}
发布了52 篇原创文章 · 获赞 10 · 访问量 1528

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/103171471