博客
关于我
5. 最长回文子串【动态规划】
阅读量:692 次
发布时间:2019-03-17

本文共 1866 字,大约阅读时间需要 6 分钟。

动态规划是一种在字符串处理中常用的算法,特别适用于寻找最长子串满足特定条件的问题。本文将介绍如何利用动态规划来找到字符串中的最长回文子串。

动态规划基本思想

为了判断一个子串是否是回文,我们需要定义一个状态:P(i, j) 表示从索引 ij 的子串是否是回文。根据回文串的性质,如果子串长度为2或以上,并且首尾字符相同,那么去掉首尾字符得到的中间子串也必须是回文。因此,状态转移方程可以定义为:

P(i, j) = P(i+1, j-1) 且 s[i] == s[j]

对于长度为1的子串,直接视为回文;长度为2的情况,只需检查首尾字符是否相等。

动态规划代码实现

  • 初始化:创建一个二维数组 dp[n][n],其中 n 是字符串的长度。对角线上的元素 dp[i][i] 初始化为 true,因为长度为1的子串是回文。

  • 填充状态转移表:从长度 2n,逐步填充状态表。对于每个子串长度 L,遍历每个可能的起始索引 i,计算结束索引 j = i + L - 1。如果 j 超出字符串长度,跳过当前情况;否则,检查字符 s[i]s[j] 是否相等,以及对应的中间子串 dp[i+1][j-1] 是否为回文。

  • 记录最大值:在状态转移过程中,记录最长回文子串的长度和起始位置。当 dp[i][j]true 且当前子串长度大于已记录的最大值时,更新最大值并记录起始位置。

  • 代码优化与实现

    以下是用 Java 语言实现的动态规划解决方案:

    public class Solution {    public String longestPalindrome(String s) {        int len = s.length();        if (len == 0) return "";        boolean[][] dp = new boolean[len][len];        int maxLen = 1;        int begin = 0;        // 初始化对角线        for (int i = 0; i < len; i++) {            dp[i][i] = true;        }        // 组建dp表        for (int L = 2; L <= len; L++) { // L 是长度            for (int i = 0; i <= len - L; i++) { // i 是起始位置                int j = i + L - 1; // 结束位置                if (s.charAt(i) != s.charAt(j)) {                    dp[i][j] = false;                } else if (L < 3) {                    dp[i][j] = true;                } else {                    dp[i][j] = dp[i + 1][j - 1];                }                if (dp[i][j] && L > maxLen) {                    maxLen = L;                    begin = i;                }            }        }        return s.substring(begin, begin + maxLen);    }}

    代码解释

  • 初始化:创建一个 len x len 的布尔数组 dp。对角线元素 dp[i][i] 初始化为 true,表示单个字符都是回文。

  • 填充状态转移表

    • 外层循环遍历子串长度 L2len
    • 内层循环遍历每个起始索引 i,计算结束索引 j = i + L - 1
    • 检查当前子串的首字符 s[i] 和末字符 s[j] 是否相同,并结合中间子串是否是回文来确定 P(i, j)
  • 记录最长回文子串:每次检查当前子串是否为回文且长度是否大于已记录的最大长度,如果满足则更新最大值和起始位置。

  • 这种方法充分利用动态规划的性质,从小的子串逐步构建最长回文子串,时间复杂度为 O(n²),适用于题目给定的字符串长度限制。

    转载地址:http://iachz.baihongyu.com/

    你可能感兴趣的文章
    nginx: [emerg] getpwnam(“www”) failed 错误处理方法
    查看>>
    nginx:Error ./configure: error: the HTTP rewrite module requires the PCRE library
    查看>>
    Nginx、HAProxy、LVS
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx中使用expires指令实现配置浏览器缓存
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx从入门到精通
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>
    Nginx代理外网映射
    查看>>
    Nginx代理模式下 log-format 获取客户端真实IP
    查看>>
    Nginx代理解决跨域问题(导致图片只能预览不能下载)
    查看>>
    Nginx代理访问提示ERR_CONTENT_LENGTH_MISMATCH
    查看>>
    Nginx代理配置详解
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    Nginx代理静态资源(gis瓦片图片)实现非固定ip的url适配网络环境映射ip下的资源请求解决方案
    查看>>
    nginx优化日志拒绝特定404请求写入
    查看>>
    Nginx使用proxy_cache指令设置反向代理缓存静态资源
    查看>>
    Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
    查看>>