zoukankan      html  css  js  c++  java
  • 动态规划——最长回文子串

      最长回文子串的问题描述:

      下面介绍动态规划的方法,使用动态规划可以达到最优的 O(n2) 复杂度。

      令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串,是则为 1,不是则为 0。这样根据 S[i] 是否等于 S[j] ,可以把转移情况分为两类:

      1.  若 S[i] == S[j],那么只要 S[i+1] 至 S[j-1] 是回文子串,S[i] 至 S[j] 就是回文子串;如果S[i+1] 至 S[j-1] 不是回文子串,则 S[i] 至 S[j] 也不是回文子串。
      2.  若 S[i] != S[j],那么 S[i] 至 S[j] 一定不是回文子串。    

      由此可以写出状态转移方程

              $dp[i][j]=left{egin{matrix}dp[i+1][j-1],S[i]==S[j]\ 0,S[i]!=S[j]end{matrix} ight.$

      边界:dp[i][i]=1,dp[i][i+1] = (S[i] == S[i+1]) ? 1 : 0。

      根据递推写法从边界出发的原理,注意到边界表示的是长度为 1 和 2 的子串,且每次转移时都对子串的长度减了 1,因此不妨考虑按子串的长度和子串的初始位置进行枚举,即第一遍将长度为 3 的子串的 dp 值全部求出,第二遍通过第一遍结果计算出长度为 4 的子串的 dp 值 ……

      代码如下:

     1 /*
     2     最长回文子串 
     3 */
     4 
     5 #include <stdio.h>
     6 #include <string.h>
     7 #include <math.h>
     8 #include <stdlib.h>
     9 #include <time.h>
    10 #include <stdbool.h>
    11 
    12 #define maxn 1010
    13 char S[maxn];
    14 int dp[maxn][maxn];                 
    15 
    16 int main() {
    17     gets(S);                        // 输入整行字符 
    18     int len=strlen(S), ans=1;        // ans 记录最长回文子串长度 
    19     int i, j, L;        
    20     // 边界 
    21     for(i=0; i<len; ++i) {            
    22         dp[i][i] = 1;
    23         if(i < len-1) {
    24             if(S[i] == S[i+1]) {
    25                 dp[i][i+1] = 1;
    26                 ans = 2;
    27             }
    28         }
    29     }
    30     // 状态转移方程 
    31     for(L=3; L<=len; ++L) {            // 枚举子串长度 
    32         for(i=0; i+L-1 < len; ++i) {    // 枚举子串的起始节点 
    33             j = i+L-1;                // 子串的右端结点 
    34             if(S[i]==S[j] && dp[i+1][j-1]==1) {
    35                 dp[i][j] = 1;
    36                 ans = L;            // 更新最长回文子串长度 
    37             }
    38         }
    39     }
    40     printf("%d
    ", ans);            // 输出 
    41 
    42     return 0;
    43 }
  • 相关阅读:
    循环
    if条件语句
    中文字符,全角字符的正则表达式
    常用正则表达式大全!(例如:匹配中文、匹配html)
    PHP中$_SERVER的详细参数与说明
    IIS 伪静态配置(安装ISAPI_Rewrite配置)
    iis php 服务器设置问题
    Apache Rewrite 拟静态配置
    DEDE时间
    DEDE 字符串操作常见问题
  • 原文地址:https://www.cnblogs.com/coderJiebao/p/Algorithmofnotes30.html
Copyright © 2011-2022 走看看