Dynamic Programming学习笔记 (19) – 分割回文串 (力扣# 131)

Dynamic Programming学习笔记 (19) – 分割回文串 (力扣# 131)分割回文串使回文子串问题中较难的一个题面,题面为:给定一个长度为N的字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。

分割回文串使回文子串问题中较难的一个题面,题面为:

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

实例:

s = "aab"
答案: {{"a","a","b"}和{"aa","b"}}

解题思路:

我们首先使用回文子串问题的解法找到所有的回文子串,然后定义一个DP表达式F(k),其中k是字串数组的下标,F(k)返回的是从k到N的子串可以分割而成的所有回文串的列表,F(1)返回的就是问题的最终答案。计算F(k)的过程是从k开始逐一找到从k开始的回文串,设定回文串的结束下标是i,我们可以通过F(i + 1)得到从i到N的的所有回文串的列表,而F(k)就是将s[i : j]添加到F(i + 1)中的每一项的头部后所形成的新的列表。

Java代码如下:

class Solution {
    public List<List<String>> partition(String s) {
        char[] chars = s.toCharArray();
        int N = chars.length;

        boolean[][] dp = new boolean[N + 1][N + 1];

        for (int i = N; i >= 1; i --) {
            dp[i][i] = true;
            for (int j = i + 1; j <= N; j ++) {
                if ((chars[i - 1] == chars[j - 1])) {
                    if ( j - i <= 2  || dp[i + 1][j - 1]) {
                        dp[i][j] = true;
                    }
                }
            }
        }

        List[] dp2 = new List[N + 1];

        for (int k = N; k >= 1; k --) {
            List<List<String>> result = new ArrayList<>();
            for (int i = k; i <= N; i ++) {
                if (dp[k][i]) {

                    String palindrome = s.substring(k - 1, i);

                    List dpValue = i < N ? dp2[i + 1] : null;
                    if (dpValue != null) {
                        for (int x = 0; x < dpValue.size(); x ++) {
                            List<String> item = new ArrayList();
                            item.add(palindrome);
                            item.addAll((List<String>) dpValue.get(x));
                            result.add(item);
                        }
                    } else {
                        result.add(Arrays.asList(palindrome));
                    }
                }
            }
            dp2[k] = result;
        }

        return dp2[1];
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13165.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注