18.4:打印一个字符串的全部排列

news/2024/11/22 22:38:16/

打印一个字符串的全部排列

方法一:暴力方法。

在这里插入图片描述

	//方法一:暴力方法。public static List<String> permutation1(String s) {//str是一个存储字符类型的有序表。ArrayList<Character> str = new ArrayList<>();//将字符串中的类型存储在str中。for (Character c : s.toCharArray()) {str.add(c);}String path = "";List<String> ans = new LinkedList<>();process(str, path, ans);return ans;}//str:字符数组。//path:记录之前选择的答案。//ans:记录最终的结果。public static void process(ArrayList<Character> str, String path, List<String> ans) {if (str.isEmpty()) {ans.add(path);return;}for (int i = 0; i < str.size(); i++) {char value = str.get(i);str.remove(i);process(str, path + String.valueOf(value), ans);//还原现场,之前在那就放在哪。str.add(i, value);}}

注意要还原现场,之前在哪个位置,就放回到哪个位置上去,保证原始数据的整洁性。

因为如果数据一旦混乱,就会出现结果的不准确。

举个例子:

"a b c d " 刚开始选a作为开头,剩下的bcd进入递归,最终将以a为开头的数据记录完成。从递归出来,然后str.add( value);

直接将a尾插,假设现在的 str = bcda,然后i++; i ==1,从str中拿出的下一个数据是c,而不是我想要的b,我们的到的结果都乱了。

由此可知,递归完成出来之后,之前什么位置的数就放回什么位置。这样保证了数据的完整性。

方法二:进行交换的方法。

	//方法二:public static List<String> permutation2(String s) {char[] str = s.toCharArray();List<String> ans = new LinkedList<>();process(str, 0, ans);return ans;}//index:表示的是当前的位置。public static void process(char[] str, int index, List<String> ans) {if (index == str.length) {ans.add(String.valueOf(str));return;}for (int i = index; i < str.length; i++) {swap(str, index, i);process(str, index + 1, ans);//还原现场,之前在那就放在哪。swap(str, index, i);}}public static void swap(char[] str, int i, int j) {char temp = str[i];str[i] = str[j];str[j] = temp;}

注意这里还是需要还原现场,之前在哪里的就放回到哪里。

比如:

在这里插入图片描述

0跟2交换的时候,a又跑到头上去了,而我想要的是c在头上。之所以出现这种情况是因为数据全乱了,在乱的数据上进行交换,会导致部分结果无法得到。

想得到正确的结果,必须在干净的数据(原始数据)上进行变换,所以每一步操作完了,就还原现场,保证数据跟原始数据一致。

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

剪枝策略:

	//打印一个字符串的全部排列,要求不要出现重复的排列public static List<String> permutation3(String s) {char[] str = s.toCharArray();List<String> ans = new LinkedList<>();process2(str, 0, ans);return ans;}public static void process2(char[] str, int index, List<String> ans) {if (index == str.length) {ans.add(String.valueOf(str));return;}boolean[] visited = new boolean[256];// ------------------------------------注意for (int i = index; i < str.length; i++) {//str[i] -> 找到该字符的ASCII码,visited[str[i]] -> 判断该字符之前是否存在过。if (!visited[str[i]]) {visited[str[i]] = true;swap(str, index, i);process2(str, index + 1, ans);//还原现场,之前在那就放在哪。swap(str, index, i);}}}

boolean[] visited = new boolean[256];这个数组的位置至关重要。

每一层创建一个visited 数组来判断这一层中某个字符是否出现过。并不是全局就创建一个visited 数组如果这样的话,结果就会出现错误。


http://www.ppmy.cn/news/283232.html

相关文章

20分钟搞定 Stable Diffusion 模型在线服务部署

文章目录 AIGC之 AI 绘画20分钟搞定 Stable Diffusion 模型在线服务部署认识 Amazon SageMaker借助 Amazon SageMaker 进行环境搭建和模型推理1. 创建 jupyter notebook 运行环境2. 一键运行所有代码 关键代码分析如下1. 环境准备&#xff0c;代码模型下载2. 在Notebook中配置并…

达芬奇的密码

写在前面郇山隐修会是一个确实存在的组织&#xff0c;是一个成立于1099年的欧洲秘密社团。1975年巴黎国家图书馆发现了被称作“秘密卷宗”的羊皮纸文献&#xff0c;才知道包括艾撒克。牛顿爵士、波提切利、维克多。雨果和列昂纳多。达。芬奇等众多人物均为郇山隐修会成员。人们…

爱情日记(2005年4月)

2005.3.31 晚饭时间&#xff0c;我和老公进行雷打不动的步骤&#xff1a;感谢并亲吻对方&#xff1a;&#xff09; 刚结婚时因为总是老公做饭&#xff0c;我觉得惭愧&#xff0c;于是在摆好碗筷之后我会说&#xff1a; “谢谢老公&#xff01;”然后吻他一下&#xff0c;才开始…

15篇文章贯通4级词汇

星火贯通CET-4四级词汇系列之一 A question of rights一项权力问题Unfortunately, a crime was about to committed but at that moment Lesley was unaware of the impending event, which would affect her life so drastically for the next two years.一项犯罪就要得逞了。…

驭势吴甘沙:我的根本利益|Xtecher人物特稿

吴甘沙&#xff0c;驭势科技CEO。前英特尔中国研究院院长。英特尔中国研究院的第一位“首席工程师”&#xff0c;第一位非美籍华人院长。 为了写这篇文章&#xff0c;我找来3月20日驭势科技的公众号发刊文《驭势未来》。读得人热气往上顶&#xff0c;颇有狄更斯《双城记》的笔锋…

从AI上天到星际逃亡:人工智能如何影响宇宙探索?

在《三体死神永生》中&#xff0c;人类为了监视三体人&#xff0c;用核力量把云天明的大脑发射到了太空当中&#xff0c;认为三体人会因此拦截下来&#xff0c;然后带回三体星球。这样&#xff0c;云天明的大脑就能监视三体人的一举一动。 结果火箭发射出现意外&#xff0c;云天…

黑客入侵16进制密码_密码与密码黑客如何诱骗您入侵您的详细信息

黑客入侵16进制密码 Time to read — 5 to 15 minutes. 阅读时间-5至15分钟。 1.密码与密码 (1. Assword vs Password) ASSWORD vs PASSWORD (The only difference is ‘P’). Your PASSWORD could have been better & protected by ‘P’. But due to missing ‘P,’ you…

【论文阅读】(2023.05.10-2023.06.03)论文阅读简单记录和汇总

(2023.05.10-2023.06.08)论文阅读简单记录和汇总 2023/05/10&#xff1a;今天状态&#xff0c;复阳大残&#xff0c;下午淋了点雨吹了点风&#xff0c;直接躺了四个小时还是头晕- -应该是阳了没跑了。 2023/06/03&#xff1a;前两周出差复阳&#xff0c;这两周调整作息把自己又…