字符串全排列

字符串全排列是一道常見的算法題,例如字符串"abc"的全排列是"abc"、"acb"、"bac"、"bca"、"cab"、"cba",這種問題通常使用遞歸的思想求解。解題思路:首先固定一個字符,對後面的字符進行全排列,以此類推,直到遇到基準情況(僅剩一個字符時)返回調用。以上邊的字符串abc爲例,首先固定a,對bc進行全排列;之後使a與b交換相當於固定b,對ac進行全排列;遞歸調用完之後不要忘記還原,再把ab調換回來,最後使ac交換固定c,對ab進行全排列。還要注意一點就是結果去重。例如如果是字符串aab進行全排列則結果會有重複的值,去重的方法可以是將結果存放在集合Set中,或者是判斷判斷兩個交換的值arr[i]和arr[j]是不是相同,如果相同則說明之後排列的過程也是相同的,無需進行下一步跳過即可,順序查找去重程序代碼:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class Permutation {

	HashSet<String> set = new HashSet<>();

	ArrayList<String> list = new ArrayList<>();
	public void permute(String str) {
		char[] strArr = str.toCharArray();
		permute(strArr, 0, strArr.length - 1);
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

	private void permute(char[] str, int low, int high) {
		if (low == high) {
			list.add(String.valueOf(str));
		}
		for (int i = low; i <= high; i++) {
			if(!(str[i] == str[low] && i!=low)){
				swap(str, i, low);
				permute(str, low + 1, high);
				swap(str, i, low);
			}
		}
	}
	
	 
	private void swap(char[] str, int begin, int end) {
		char temp;
		temp = str[begin];
		str[begin] = str[end];
		str[end] = temp;

	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String s = in.nextLine();
		Permutation test = new Permutation();
		test.permute(s);
	}

}

使用集合方法代碼:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;

public class Permutation {

	HashSet<String> set = new HashSet<>();

	ArrayList<String> list = new ArrayList<>();
	public void permute(String str) {
		char[] strArr = str.toCharArray();
		permute(strArr, 0, strArr.length - 1);
		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

	private void permute(char[] str, int low, int high) {
		if (low == high) {
			set.add(String.valueOf(str));
		}
		for (int i = low; i <= high; i++) {
				swap(str, i, low);
				permute(str, low + 1, high);
				swap(str, i, low);
		}
	}
	
	 
	private void swap(char[] str, int begin, int end) {
		char temp;
		temp = str[begin];
		str[begin] = str[end];
		str[end] = temp;

	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		String s = in.nextLine();
		Permutation test = new Permutation();
		test.permute(s);
	}

}

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