字符串的全排列 递归方法实现
要实现字符串全排列 我觉得像是一种分治法的感觉。比如AB只有两种 :
AB BA
到了ABC时可以抽出A 只看BC的话就是两种,然后BC全排列之后放在A后面。
随后取出B对AC全排列放在B后面
以此类推,此算法非常精美 但是位数多了全排列数量会呈指数式增长。
代码如下:
import java.util.ArrayList;
import java.util.List;
public class StringTest {
public static void main(String[] args) {
List<String> ls = permutations("ABCD");
for(String s:ls){
System.out.println(s);
}
}
public static List<String> permutations(String str){
//每一组排列都被存储在字符串列表中
List result = new ArrayList<>();
//基本情况
if(str.length()==1){
result.add(str);
}else{
//对字符串每一个字符执行操作
for(int i=0;i<str.length();i++){
//对EveryThingElse返回的字符串组合进行操作
for(String p:permutations(EverythingElse(str, i))){
//插入当前字符到排列中
result.add(str.charAt(i)+p);
}
}
}
return result;
}
private static String EverythingElse(String str,int IndexToIngore){
StringBuilder result = new StringBuilder();
for(int i=0;i<str.length();i++){
if(IndexToIngore!=i){
result.append(str.charAt(i));
}
}
return result.toString();
}
}
但是这个代码有个明显的缺陷请你思考一下
就是有重复字符的话会输出重复的排列 比如AAB的时候就会有重复
所以简单办法就是使用set数据结构进行字符串的存储 他会自动去重,十分好用
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class StringTest {
public static void main(String[] args) {
Set<String> set = permutations("ABC");
for(String s:set){
System.out.println(s);
}
}
public static Set<String> permutations(String str){
//每一组排列都被存储在字符串列表中
Set result = new HashSet<>();
//基本情况
if(str.length()==1){
result.add(str);
}else{
//对字符串每一个字符执行操作
for(int i=0;i<str.length();i++){
//对EveryThingElse返回的字符串组合进行操作
for(String p:permutations(EverythingElse(str, i))){
//插入当前字符到排列中
result.add(str.charAt(i)+p);
}
}
}
return result;
}
private static String EverythingElse(String str,int IndexToIngore){
StringBuilder result = new StringBuilder();
for(int i=0;i<str.length();i++){
if(IndexToIngore!=i){
result.append(str.charAt(i));
}
}
return result.toString();
}
}