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 如果字符已经被使用过,跳过

京公网安备 11010502036488号