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)

相关推荐

  • mstsc服务器批量管理好友 vps服务器批量「建议收藏」

    mstsc服务器批量管理好友 vps服务器批量「建议收藏」mstsc服务器批量管理好友 vps服务器批量远程桌面是微软公司为了便于网络管理员管理维护服务器推出的一项服务。从windows 2000 server版本开始引入,网络管理员时候远程桌面连接器连接…

    2023-02-23
    149
  • 用Python编程快速优化您的生产效率

    用Python编程快速优化您的生产效率在日常工作中,您是否曾经遇到过以下问题:

    2024-03-16
    88
  • Python多线程爬虫实战

    Python多线程爬虫实战随着互联网技术的发展,许多网站都提供了开放的API,使得获取数据变得更加容易。但是,一些数据并没有提供API接口,此时需要进行网页爬取。为了提高效率,降低对网站服务器的负荷,使用多线程技术是非常必要的。Python作为一种简单易用的语言,拥有众多的爬虫库和多线程模块,为开发人员提供了很大的便利。

    2024-07-22
    38
  • excel快捷小技巧_电子表格办公小技巧汇总大全

    excel快捷小技巧_电子表格办公小技巧汇总大全天下武功,唯快不破。快既是一种境界,也是一种能力。今天就和大家分享6个Excel快速操作小技巧,让你可以节省更多时间,毕竟时间就是生命,时间就是金钱。1、快速求和求和大家都知道可以使用SUM函数,但是

    2023-03-02
    157
  • Python中跳出for循环的方法

    Python中跳出for循环的方法在Python编程中,for循环是一种对于序列进行遍历的常用循环结构。但是,在某些情况下,我们可能需要在循环中提前跳出,或者是跳过某些不需要处理的元素。本篇文章将会介绍Python中跳出for循环的方法。

    2024-08-03
    29
  • all of them are from china(it an)

    all of them are from china(it an)

    2023-09-03
    137
  • mongodb教程pdf_mongodb入门

    mongodb教程pdf_mongodb入门MongoDB 教程 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数…

    2023-03-31
    191
  • 以Python字典更新为中心的实用技巧

    以Python字典更新为中心的实用技巧Python中的字典(dict)是一种非常实用的数据类型,它可以用于存储键-值对,提供了灵活的数据存储方式。在实际应用中,经常需要对字典进行更新,以满足不同的需求。本篇文章将介绍以Python字典更新为中心的实用技巧。

    2024-06-20
    40

发表回复

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