import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param k int整型 * @return string字符串一维数组 */ public String[] getPermutation(String s, int k) { char[] chars = s.toCharArray(); // 将字符串转化为字符数组 boolean[] used = new boolean[chars.length]; // 用于标记字符是否已经被使用过 StringBuilder path = new StringBuilder(); // 用于保存当前的排列结果 List<String> result = new ArrayList<>(); // 用于保存所有的排列结果 Arrays.sort(chars); backtrack(chars, used, path, result, k); // 调用回溯函数 String [] str = new String[result.size()]; for (int i = 0; i < result.size(); i++) { str[i] = result.get(i); } return str; // 返回结果集 } private void backtrack(char[] chars, boolean[] used, StringBuilder path, List<String> result, int k) { if (result.size() == k) { // 如果已经生成了k个排列,直接返回 return; } if (path.length() == chars.length) { // 如果已经生成了一个完整的排列,添加到结果集中 result.add(path.toString()); return; } for (int i = 0; i < chars.length; i++) { // 遍历字符数组 if (used[i]) { // 如果字符已经被使用过,跳过 continue; } path.append(chars[i]); // 将当前字符添加到路径中 used[i] = true; // 标记当前字符为已使用 backtrack(chars, used, path, result, k); // 递归调用回溯函数,生成下一个字符的排列 path.deleteCharAt(path.length() - 1); // 回溯,将当前字符从路径中移除 used[i] = false; // 标记当前字符为未使用 } } }
本题知识点分析:
1.回溯法
2.集合存取
3.数组遍历
本题解题思路分析:
1.先sort排序chars字符串
2.利用回溯法
3.1 如果已经生成了k个排列,直接返回
3.2 如果已经生成了一个完整的排列,添加到结果集中
3.3 如果字符已经被使用过,跳过