字符串全排列
来源:互联网 发布:手机数据清除有影响吗 编辑:程序博客网 时间:2024/06/05 14:04
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
初次看到,没有思路,百度了一下,参考了一篇c++实现的文章。
理解与解决
根据参考的文章的思路,将每一个位置固定,然后求剩下部分的全排列。想起最近看的《算法导论》的第15章动态规划中的开篇钢条切割问题,里面的推倒:
根据这个思路,结合参考的文章,字符串(str例如:”abc”的全排列R:
…
根据上面的分析,首先我们需要去遍历整个字符串,因为是全排列,每个字符都有会成为第一个元素。
Java实现代码:
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;public class Solution_Zi_fu_chuan_de_pai_lie { private ArrayList<String> result = new ArrayList<>(); public ArrayList<String> Permutation(String str) { char[] chars = str.toCharArray(); Arrays.sort(chars); doHandle(chars, 0, chars.length - 1); //Collections.sort(result); return result; } private void doHandle(char[] chars, int i, int n) { if (i == n) { result.add(new String(chars)); } else { for (int j = i; j <= n; j++) { // 这里是排除如果有相同的元素,就不把相同的元素放到首位了,直接跳过 // 例如:ABACD // 如果不加上下面的判断,那么交换位置三的A到首位,和没有交换是相同的,那么,就会出现重复的情况。 // 此时交换与不交换两种情况对应的(R1+Rn-1)和(R3+Rn-1)中,R1和R3都是‘A’,emmm...这个公式推理应该是易懂的吧 if (j - i >= 1 && chars[j] == chars[i]) { continue; } swap(chars, i, j); // moveRight(chars, i, j); doHandle(chars, i + 1, n); swap(chars, i, j); // moveLeft(chars, i, j); } } } private void swap(char[] chars, int i, int j) { char c; c = chars[i]; chars[i] = chars[j]; chars[j] = c; }}
对于上面的程序,是不符合题目要求的,上面的输出是:
[abc, acb, bac, bca, cba, cab]
注意观察最后两组为:cba,cab
。解决的方法可以直接在Permutation
返回结果前执行Collections.sort(result)
重新排序。
但有没有其他方法呢,不去调用Collections.sort(result)
,根据上面思路的分析,其实我们的本意并不是通过swap
这样的交换来达到每一个字符都出现在首位的目的,我们在将某一个字符放到首位的时候,不能去改变其他字符的相对位置,因此可以通过移动的方式。
private void moveRight(char[] chars, int i, int j) { char temp = chars[j]; for (int k = j - 1; k >= i; k--) { chars[k + 1] = chars[k]; } chars[i] = temp; } private void moveLeft(char[] chars, int i, int j) { char temp = chars[i]; for (int k = i; k < j; k++) { chars[k] = chars[k + 1]; } chars[j] = temp; }
moveRight
向右移动,将j
位置的元素与i
位置的元素交换;moveLeft
向左移动,将j
位置的元素与i
位置的元素交换,等待下一轮的遍历,这两种方式都没有影响其他元素的相对顺序。
阅读全文
0 0
- 字符串的全排列
- 字符串的全排列
- 字符串全排列问题
- 字符串全排列
- 字符串全排列问题
- 字符串全排列
- 求字符串全排列
- 求字符串全排列
- 字符串的全排列
- 字符串全排列代码
- 字符串全排列
- 字符串全排列
- 字符串全排列
- 字符串的全排列
- 字符串全排列
- 求字符串全排列
- 字符串全排列
- 字符串的全排列
- java.io.IOException: Cannot run program "/opt/java/sdk/build-tools/23.0.1/aapt": error=2, No such fi
- Git 最基本的操作命令
- 习题8.2
- Android fragment与Activity交互
- @GeneratorValue与@GenericGenerator注解使用心得
- 字符串全排列
- 脱壳解壳android安全
- random模块
- 解决 ajax报错406,springMVC报错406,页面报错406解决办法
- java 搭建基于springboot的ssm(spring + springmvc + mybatis)的maven项目
- 语谱图 基频 共振峰
- 第一篇博客
- 诸葛亮出山前也没有带过兵啊,凭什么要求我有工作经验?
- pacemaker corosync 做高可靠的WEB HA