字符串排列組合(去重)

字符串排列組合

一、 字符串排列

要求字符串: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 + "|");
		}
	}```

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章