题解 | #字符串的排列#
字符串的排列
https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param str string字符串
* @return string字符串ArrayList
*/
ArrayList<String> res = new ArrayList<>();
public ArrayList<String> Permutation (String str) {
// 存储数据
// 边界情况
if (str == null || str.length() == 0) {
return res;
}
// 排序,注意这个是一个包含重复字符的排序
boolean[] flag = new boolean[str.length()];
StringBuffer list = new StringBuffer();
char[] charStr = str.toCharArray();
// 按字典序排序
Arrays.sort(charStr);
// 调用递归函数
recursion(charStr, list, flag);
return res;
}
private void recursion(char[] charStr, StringBuffer list, boolean[] flag) {
if (list.length() == charStr.length) {
res.add(new String(list));
return;
}
for (int i = 0; i < charStr.length; i++) {
// 跳过已使用的字符
if (flag[i]) {
continue;
}
// 跳过重复的字符
if (i > 0 && charStr[i] == charStr[i - 1] && !flag[i - 1]) {
continue;
}
list.append(charStr[i]);
flag[i] = true;
recursion(charStr, list, flag);
// 回溯
list.deleteCharAt(list.length() - 1);
flag[i] = false;
}
}
}
