题目的实质是全排列问题求解,
首先是对题目要求编写相应的转换函数。
//数组转换为字符串 public String change(char[] a){ StringBuffer res = new StringBuffer(); for(char linkString : a){ res.append(linkString); } return res.toString();//返回数组 }
其次是字符串数组转换为集合
//字符串转换为数组 char[] a =str.toCharArray();//转换为字符串数组 ArrayList<String> ans = new ArrayList<String>(); sovle(ans,a,0,str.length());
核心代码函数:
private void sovle(ArrayList<String> ans, char[] a, int i, int length) { // TODO Auto-generated method stub if(i == length-1){ String resString = change(a); ans.add(resString); }else{//index不在最后一个位置 for(int j = i;j<length;j++){ char temp = a[i]; a[i] = a[j]; a[j] = temp; //进行下一个字符的交换 sovle(ans,a,i+1,length); temp = a[i]; a[i] = a[j]; a[j] = temp; } } }
全部代码:
import java.util.*; public class Solution { public ArrayList<String> Permutation(String str) { //字符串转换为数组 char[] a =str.toCharArray();//转换为字符串数组 ArrayList<String> ans = new ArrayList<String>(); sovle(ans,a,0,str.length()); //定义一个set进行重复数值排序去重 ans = new ArrayList<String>(new HashSet<String>(ans)); Collections.sort(ans); return ans; } //数组转换为字符串 public static String change(char[] a){ StringBuffer res = new StringBuffer(); for(char linkString : a){ res.append(linkString); } return res.toString();//返回数组 } public static void sovle(ArrayList<String> ans, char[] a, int index, int length) { // TODO Auto-generated method stub if(index == length-1){ String resString = change(a); ans.add(resString); }else{//index不在最后一个位置 for(int i = index;i<length;i++){ char temp = a[i]; a[i] = a[index]; a[index] = temp; //进行下一个字符的交换 sovle(ans,a,index+1,length); temp = a[i]; a[i] = a[index]; a[index] = temp; } } } }