1 题目
输入一个字符串,打印出该字符串中字符的所有排列。
你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]
限制:
1 <= s 的长度 <= 8
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 Java
2.1 @方法一(递归,回溯)
每次从“剩余字符串”中取一个字符加入“已加入字符串”,不断递归,直至“剩余字符串”长度为0,说明该情况已递归到尽头,记录一个结果
用HashSet记录,以去重
本方法用到许多字符串相关的API,可用作复习
集合转数组
set.toArray(new String[0]);
String和StringBuilder相互转换
StringBuilder sB = new StringBuilder(s);
String s = sB.toString();
String和StringBuilder共性:字符串截取
s.substring(0, i);
StringBuilder特有:尾部增加、删除
sB.append(String s);
sB.deleteCharAt(int index);
下面是使用StringBuffer的方法
class Solution {
HashSet<String> set = new HashSet<>();
public String[] permutation(String s) {
StringBuilder curS = new StringBuilder(s);
StringBuilder subS = new StringBuilder();
helper(curS, subS);
// 将list转换为数组
return set.toArray(new String[0]);
}
// curS:待加入(剩余)字符串;subS:已加入字符串
public void helper(StringBuilder curS, StringBuilder subS){
// 若待加入字符串只剩一个字符,加入后直接记录该字符串;且在记录完后弹出最后一个字符
if(curS.length() == 1){
set.add(subS.append(curS).toString());
subS.deleteCharAt(subS.length() - 1);
return;
}
// 从剩余字符串中选一个加入,且各自成为一种情况再向下层深入
for(int i = 0; i < curS.length(); i++){
StringBuilder curSTemp = new StringBuilder();
curSTemp.append(curS.substring(0, i));
curSTemp.append(curS.substring(i + 1));
// curSTemp是剔除了刚加入字符后的剩余字符串
helper(curSTemp, subS.append(curS.substring(i, i + 1)));
subS.deleteCharAt(subS.length() - 1);
}
}
}
2.2 方法二(递归,回溯)
使用String的方法
class Solution {
HashSet<String> set = new HashSet<>();
public String[] permutation(String s) {
String subS = "";
helper(s, subS);
// 将list转换为数组
return set.toArray(new String[0]);
}
// curS:待加入(剩余)字符串;subS:已加入字符串
public void helper(String curS, String subS){
if(curS.length() == 1){
set.add(subS + curS);
return;
}
// 从剩余字符串中选一个加入,且各自成为一种情况再向下层深入
for(int i = 0; i < curS.length(); i++){
helper(curS.substring(0, i) + curS.substring(i + 1), subS + curS.substring(i, i + 1));
}
}
}