1. 程式人生 > >字串全排列演算法java實現

字串全排列演算法java實現

字串的全排列 遞迴方法實現

要實現字串全排列 我覺得像是一種分治法的感覺。比如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();
		
	}
}

美滋滋