剑指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;
}
}