• 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )


    1、问题描述

    给定一个字符串(序列),求该序列的最长的回文子序列。

    2、分析

    需要理解的几个概念:

    ---回文

    ---子序列

    ---子串

    http://www.cnblogs.com/LCCRNblog/p/4321398.html这一篇文章描述了利用动态规划求解两个序列的最长公共子序列(Longest Common Sequence)。

    假设LCS(X,Y)表示序列X,Y的最长公共子序列,LPS(X)表示X的最长回文子序列;

    在设序列X1为X的装置序列(逆序),比如X=“123”,X1=“321”;

    则有:

    LCS(X,X1) = LPS(X)。

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         string s1(s.rbegin(),s.rend());
     5         //s1.reserve()
     6         //cout << s1 <<endl;
     7 
     8         return LCS(s,s1);
     9 
    10     }
    11 
    12 
    13     string LCS(string str1,string str2)
    14     {
    15 
    16         int length1,length2;
    17         //int** arr;
    18         const int row=110;
    19         const int col=110;
    20         int arr[row][col];
    21 
    22         length1 = str1.length(); 
    23         length2 = str2.length();
    24         
    25         memset(arr,0,sizeof(arr));
    26         for (int i=1;i<=length1;i++)
    27         {
    28             for (int j=1;j<=length2;j++)
    29             {
    30                 if (str1[i-1] == str2[j-1])//这里为什么要用i-1,j-1,因为str中的下标从0开始
    31                 {
    32                     arr[i][j]=arr[i-1][j-1]+1;
    33                 }
    34                 else
    35                 {
    36                     arr[i][j]=(arr[i-1][j] > arr[i][j-1]?arr[i-1][j]:arr[i][j-1]);
    37                 }
    38             }
    39         }
    40         //cout << arr[length1][length2]<<endl;
    41 
    42         //打印其中一个最长子序列
    43         string print="";
    44         for (int i=length1,j=length2;i>=1&&j>=1;)//这里是倒序打印的
    45         {
    46             if (str1[i-1] == str2[j-1])
    47             {
    48                 //cout << str1[i-1]<<" ";//按照这样会倒序打印
    49                 print = str1[i-1]+print;
    50                 i--;
    51                 j--;
    52             }else
    53             {
    54                 if(arr[i][j -1] >= arr[i - 1][j])j--;
    55                 else
    56                     i--;
    57 
    58             }
    59 
    60         }
    61         return print;
    62 
    63     }
    64 
    65 };
  • 相关阅读:
    【转载】CSS的inline、block与inline-block
    MySQL常用语法
    JS模态对话框
    CS3常用属性手记
    画布常用手记
    CSS属性常用手记
    H5试题
    window对象常用手记
    js对象常用手记
    常用DOM对象手记
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4444058.html
Copyright © 2020-2023  润新知