string 的全排列 java 思路是啥
时间: 2023-11-18 14:02:57 浏览: 42
字符串的全排列可以使用回溯算法来实现。具体思路如下:
1. 将字符串转换成字符数组,方便进行操作。
2. 定义一个 boolean 类型的数组 used,用于标记字符是否已经被使用过。
3. 定义一个 StringBuilder 类型的变量 sb,用于存储当前的排列结果。
4. 定义一个递归函数,用于生成全排列。函数的参数包括字符数组、used 数组、sb 变量、当前处理的位置以及字符串的长度。
5. 在递归函数中,首先判断当前处理的位置是否等于字符串的长度,如果是,则说明已经生成了一种排列,将当前排列加入结果集中。
6. 如果当前处理的位置小于字符串的长度,那么就遍历字符数组,对于每个字符,判断它是否已经被使用过,如果已经使用过,则跳过;否则,将其加入到 sb 变量中,并将 used 数组中对应的位置标记为已使用。
7. 然后递归处理下一个位置,处理完成后,需要将当前字符从 sb 变量中删除,并将 used 数组中对应的位置标记为未使用,以便后续的处理。
8. 最后返回结果集即可。
Java 代码实现如下:
```java
public List<String> permutation(String s) {
List<String> res = new ArrayList<>();
if (s == null || s.length() == 0) {
return res;
}
char[] arr = s.toCharArray();
boolean[] used = new boolean[arr.length];
StringBuilder sb = new StringBuilder();
dfs(arr, used, sb, res, 0, arr.length);
return res;
}
private void dfs(char[] arr, boolean[] used, StringBuilder sb, List<String> res, int index, int len) {
if (index == len) {
res.add(sb.toString());
return;
}
for (int i = 0; i < len; i++) {
if (!used[i]) {
used[i] = true;
sb.append(arr[i]);
dfs(arr, used, sb, res, index + 1, len);
sb.deleteCharAt(sb.length() - 1);
used[i] = false;
}
}
}
```