1.题目
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。
2.解法
2.1 题目框架
import java.util.ArrayList;
public class Solution {
public ArrayList<String> Permutation(String str) {
}
}
2.2 解法
这道题是全排列,其实就是一道回溯算法。
回溯算法其实就是一种深度优先遍历。只是在遍历的时候会带上一个列表来沿路收集元素,当这个列表搜集满了就放进结果集。然后,从中拿出一个元素,再次进行遍历,反复这样进行。
public class Solution {
public ArrayList<String> Permutation(String str) {
HashSet<String> set = new HashSet<>();
StringBuilder path = new StringBuilder();
backtrace(set,path,str);
return new ArrayList<>(set);
}
public void backtrace(HashSet<String> ans, StringBuilder path,String src) {
if(src.length()==0) ans.add(path.toString());
for(int i=0;i<src.length();i++){
path.append(src.charAt(i));
String newsrc = new StringBuilder(src).deleteCharAt(i).toString();
backtrace(ans,path,newsrc);
path.deleteCharAt(path.length()-1);
}
}
}
总结
一道回溯问题,就是不断做选择、选择后进行深度优先(即递归调用自己),然后取消选择。
算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。