字符串全排列

字符串全排列是一道常见的算法题,例如字符串"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);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值