字符串排列組合
一、 字符串排列
要求字符串: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 + "|");
}
}```