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、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。
本文详细介绍了如何使用Java实现字符串的全排列,主要通过回溯算法来解决。解法中,利用深度优先遍历和回溯策略收集所有可能的排列组合。博客还提供了一个具体的示例,如输入字符串'ABC',输出所有可能的排列。同时,文章总结了回溯问题的关键在于不断尝试并撤销选择,适合解决组合爆炸问题。
172万+

被折叠的 条评论
为什么被折叠?



