字符串排列组合
一、 字符串排列
要求字符串:abc产生abc |acb|bac|bca|cab|cba
思路:
1、固定一个位置第一个位置,数组中该位置之后的元素与该位置元素交换,
2、在1的基础之上,固定第二个位置,数组数组中该位置之后的元素与该位置元素交换
3、递归退出条件:当位置指针等于当前数组的长度,返回当前字符串排序
4、递归:
(1)交换元素
(2)递归调用下一位置
(3)将数组还原
5、去重方式
(1)通过Hashset去重
(2)通过增加isSwap()//目的在于判断当前位置的元素在前边数组中已经已经出现
补充,由于本人在牛客测试,由于最终结果与标准结果顺序存在差别,可以自己添加比较器
class Compare implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
代码
import java.util.ArrayList;
import java.util.HashSet;
class Permutation {
ArrayList<String> list = new ArrayList<>();
HashSet<String> set = new HashSet<>();
//主函数
public ArrayList<String> Permutation(String str) {
char[] c = str.toCharArray();
int pointer = 0;
oper(pointer, c);
return list;
}
/**
* 字符串排列并去重
*
* @param pointer
* @param c
*/
public void oper(int pointer, char[] c) {
if (pointer == c.length) {
String end = String.valueOf(c);
if (!set.contains(end)) {
list.add(end);
set.add(end);
}
} else {
for (int i = pointer; i < c.length; i++) {
swap(c, pointer, i);
oper(pointer + 1, c);
swap(c, i, pointer);
}
}
}
}
二、字符串组合
要求:abc==>a|b|c|ab|ac|bc|abc
1、定义空字符串用来存储递归跳出的的结果
2、递归跳出条件:指针等于数组长度(需要将字符串转化为字符数组)
3、递归函数:
(1)下一个字符串不包含当前位置元素
(2)下一个字符串包含当前位置元素
4、去重:通过HashSet去重
代码
import java.util.ArrayList;
import java.util.HashSet;
class Permutation {
ArrayList<String> listc = new ArrayList<>();
HashSet<String> setc = new HashSet<>();
//主函数
public ArrayList<String> Combination(String str) {
char[] c = str.toCharArray();
int pointer = 0;
combin(c, pointer,"");
listc.remove("");
return listc;
}
/**
* 字符串组合
* @param str
* @param pointer
*/
private void combin(char[] c, int pointer,String res) {
if(pointer == c.length ) {
if(!setc.contains(res)){
listc.add(res);
setc.add(res);
return ;
}
}else{
combin(c, pointer+1, res+c[pointer]);//下一个包含该字符串
combin(c, pointer+1, res);//下一个不包含该字符串
}
}
}
测试
public static void main(String[] args) {
String string = "aab";
Permutation per = new Permutation();
ArrayList<String> res = per.Permutation(string);
System.out.println("==============字符串排列==============");
for (String str : res) {
System.out.print(str + "|");
}
System.out.println();
ArrayList<String> com = per.Combination(string);
System.out.println("==============字符串组合==============");
for (String str : com) {
System.out.print(str + "|");
}
}```