zoukankan      html  css  js  c++  java
  • 动态规划求一个序列的最长回文子序列(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 };
  • 相关阅读:
    Mac OS X上安装 Ruby运行环境
    MAC 命令行工具(Command Line Tools)安装
    如何快速正确的安装 Ruby, Rails 运行环境
    安裝 Rails 開發環境
    用模块化编程
    阅读技术书籍
    NHibernate构建一个ASP.NET MVC应用程序
    SQL注入
    Redis
    Code digest
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4444058.html
Copyright © 2011-2022 走看看