暴力递归——打印字符串的全部排列(顺序,剪枝)

import java.util.ArrayList;

//打印一个字符串的全部排列,要求不要出现重复的排列
public class PrintAllPermutations {

	public static ArrayList<String> Permutation(String str) {
		ArrayList<String> res = new ArrayList<>();
		if (str == null || str.length() == 0) {
			return res;
		}
		//将字符串转换为数组
		char[] chs = str.toCharArray();
		process(chs, 0, res);
		res.sort(null);
		return res;
	}

	//res为记录结果的List
	//str[i..]范围上,所有的字符,都可以在i位置上,后续都去尝试
	//str[0..i-1]范围上,是之前做的选择
	//请把所有全排列形成的字符串,加入到res里去
	public static void process(char[] chs, int i, ArrayList<String> res) {
		//如果i等于chs的最后一位,把chs添加入res
		if (i == chs.length) {
			res.add(String.valueOf(chs));
		}
		boolean[] visit = new boolean[26];
		//遍历i之后j的数组
		for (int j = i; j < chs.length; j++) {
			//如果chs[j]不为a,意思是如果已经尝试过a进行位置置换,则下次遇到就不尝试了
			//其实不加这段判断同样可以获得结果,但是结果需要去重
			if (!visit[chs[j] - 'a']) {
				visit[chs[j] - 'a'] = true;
				//交换字符串实现后续process,随后交换回来
				swap(chs, i, j);
				process(chs, i + 1, res);
				swap(chs, i, j);
			}
		}
	}

	//交换chs[i]和chs[j]的位置
	public static void swap(char[] chs, int i, int j) {
		char tmp = chs[i];
		chs[i] = chs[j];
		chs[j] = tmp;
	}

}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值