输⼊⼀个字符串,按字典序打印出该字符串中字符的所有排列。例如输⼊字符串 abc ,则按字典序打印出由字符 a , b , c 所能排列出来的所有字符串 abc , acb , bac , bca , cab 和 cba 。
输⼊描述:输⼊⼀个字符串,⻓度不超过9(可能有字符重复),字符只包括⼤⼩写字⺟
看到题目,应该就知道要使⽤回溯了。
通过 回溯算法 生成所有排列,配合 剪枝条件 实现去重和字典序输出。关键步骤包括:
import java.util.ArrayList;
import java.util.Collections;
public class StringPermutation {
public ArrayList permutation(String str) {
ArrayList result = new ArrayList();
if (str == null || str.length() == 0) {
return result;
}
char[] chars = str.toCharArray();
permute(chars, 0, result);
Collections.sort(result); // 按字典序排序
return result;
}
private void permute(char[] chars, int begin, ArrayList result) {
if (begin == chars.length - 1) {
result.add(new String(chars));
return;
}
for (int i = begin; i
上面方法主要是通过Set进行去重,也可以将字符数组排序来跳过重复字符:
public class StringPermutation {
public ArrayList permutation(String str) {
ArrayList result = new ArrayList();
if (str == null || str.length() == 0) {
return result;
}
char[] chars = str.toCharArray();
Arrays.sort(chars); // 先排序便于去重
boolean[] used = new boolean[chars.length];
backtrack(chars, used, new StringBuilder(), result);
return result;
}
private void backtrack(char[] chars, boolean[] used,
StringBuilder path, ArrayList result) {
if (path.length() == chars.length) {
result.add(path.toString());
return;
}
for (int i = 0; i 0 && chars[i] == chars[i-1] && !used[i-1])) {
continue;
}
used[i] = true;
path.append(chars[i]);
backtrack(chars, used, path, result);
path.deleteCharAt(path.length() - 1); // 回溯
used[i] = false;
}
}
}
此方法算法理解难度较大,非标准解法
用字典序生成下一个排列的算法:
import java.util.ArrayList;
import java.util.Arrays;
public class StringPermutation {
public ArrayList permutation(String str) {
ArrayList result = new ArrayList();
if (str == null || str.length() == 0) {
return result;
}
char[] chars = str.toCharArray();
Arrays.sort(chars); // 初始排序
result.add(new String(chars));
while (true) {
int i = chars.length - 2;
// 从后向前找第一个升序对
while (i >= 0 && chars[i] >= chars[i + 1]) {
i--;
}
if (i
本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top
参与评论
手机查看
返回顶部