LeetCode系列:字符串排列问题

字符串的排列,剑38

1. 描述

  • 输入一个字符串,打印出该字符串中字符的所有排列。
  • 可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
输入:s = "abc"
输出:["abc","acb","bac","bca","cab","cba"]
输入: s = "bbc"
输出: s = ["bbc", "bcb", "cbb"]

2. 方法(回溯)

  • 通过交换i与index的值来固定一个值(index及之前的值);适合解决排列树问题(例如题 - 全排列,全排列II);
  • 本题使用Set剪枝;
  • 其中ans与c可以改为类的成员变量,简化代码。
class Solution {
     
    public String[] permutation(String s) {
     
        List<String> ans = new LinkedList<>();
        if (s.equals("")) {
     
            return new String[0];
        }
        backtrack(ans, s.toCharArray(), 0);
        return ans.toArray(new String[0]);
    }
    
    private void backtrack(List<String> ans, char[] c, int index) {
     
        if (index == c.length) {
     
            ans.add(String.valueOf(c));
        }
        Set<Character> set = new HashSet<>();
        for (int i = index; i < c.length; i++) {
     
            if (set.contains(c[i])) {
     
                continue;
            }
            set.add(c[i]);
            swap(c, index, i);
            backtrack(ans, c, index + 1);
            swap(c, index, i);
        }
    }
            
    private void swap(char[] c, int a, int b) {
     
        char temp = c[a];
        c[a] = c[b];
        c[b] = temp;
    }
}

你可能感兴趣的:(leetcode)