在各种算法竞赛,或者是笔试面试的过程中,全排列问题非常常见,列举一下一个经典的全排列问题,以遍后期巩固
剑指 Offer 38. 字符串的排列:
输入一个字符串,打印出该字符串中字符的所有排列。
示例:
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
这是一个典型的全排列问题,那么遇到全排列问题我们到底该如何处理呢?
- 首先我们就想到了递归
- 然后我们需要一个辅助数组
- 然后我们还用到了回溯算法
我们可以用一个数组 boolean used [ ] 来表示当前位置的字符是否使用过,如果使用过的话那么我们进行下一位,最后再还原 为初始状态。贴一下代码,下面的代码也是一个模板!
import java.util.*;
public class lk {
static Set<String> set = new HashSet<>(); //hash去重
public static void main(String[] args) {
String str = "ABCD";
boolean[] used = new boolean[str.length()];
dfs(str, used, "");
for (String strs : set) {
System.out.println(strs);
}
}
private static void dfs(String str, boolean[] used, String string) {
// TODO Auto-generated method stub
if (string.length() == str.length()) { //终止条件
set.add(string);
return;
}
for (int i = 0; i < str.length(); i++) {
if (used[i]) {
continue;
} else {
used[i] = true;
dfs(str, used, string+str.charAt(i) );
used[i] = false; //回溯
}
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于