525 字
3 分钟
LeetCode刷题(全排列Ⅱ、分割回文串)

全排列Ⅱ#

题目描述#

给定一个可包含重复数字的整数集合 nums按任意顺序 返回它所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

题解#

先对数组排序,然后设置一个辅助的visit数组记录用过的元素,每次调用dfs函数都尝试将所有的元素放入list中,如果其中有元素被用过了则排除当前情况,另外如果当前元素和前一个元素都没有被用过,且他们数值相等则跳过

放入list进行放置下一个数字,放完后删除,达到回溯

class Solution {
    List<List<Integer>> result = new LinkedList<>();
    List<Integer> list = new LinkedList<>();
    boolean[] visit;

    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        visit = new boolean[nums.length];
        dfs(nums);
        return result;
    }

    public void dfs(int[] nums) {
        if(list.size() == nums.length) {
            result.add(new LinkedList<>(list));
            return;
        }
        for(int i = 0; i < nums.length; i++) {
            if(visit[i]) {
                continue;
            }
            if(i > 0 && !visit[i] && !visit[i - 1] && nums[i] == nums[i - 1]) {
                continue;
            }
            list.add(nums[i]);
            visit[i] = true;
            dfs(nums);
            visit[i] = false;
            list.remove(list.size() - 1);
        }
    }
}

分割回文串#

题目描述#

给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。

回文串 是正着读和反着读都一样的字符串。

示例 1:

输入:s = "google"
输出:[["g","o","o","g","l","e"],["g","oo","g","l","e"],["goog","l","e"]]

示例 2:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 3:

输入:s = "a"
输出:[["a"]]

题解#

先运用动态规划求出dp,再使用回溯进行依次判断取出所有的可能

class Solution {
    List<List<String>> result = new LinkedList<>();
    List<String> list = new LinkedList<>();
    boolean[][] dp;

    public List<List<String>> partition(String s) {
        int n = s.length();
        dp = new boolean[n][n];
        for(int len = 1; len <= n; len++) {
            for(int left = 0; left <= n - len; left++) {
                int right = left + len - 1;
                if((s.charAt(left) == s.charAt(right)) && (right - left < 2 || dp[left + 1][right - 1])) {
                    dp[left][right] = true;
                }
            }
        }
        dfs(s, 0);
        return result;
    }

    public void dfs(String s, int index) {
        if(s.length() == index) {
            result.add(new LinkedList<>(list));
            return;
        }
        for(int i = index; i < s.length(); i++) {
            if(dp[index][i]) {
                list.add(s.substring(index, i + 1));
                dfs(s, i + 1);
                list.remove(list.size() - 1);
            }
        }
    }
}
LeetCode刷题(全排列Ⅱ、分割回文串)
https://thrinisty.github.io/Blog/posts/leetcode刷题全排列ⅱ分割回文串/
作者
Thrinisty
发布于
2025-12-27
许可协议
CC BY-NC-SA 4.0