Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13998
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-04 14:30
个人简介

programmer and engineer

文章分类

全部博文(7)

文章存档

2013年(7)

我的朋友

分类: C/C++

2013-03-11 17:02:42

给定一个字符串,求出其中最长的回文字串。

令N为字符串的长度,用brute force的话,总共有N2个可能的子字符串,判断每个字串是不是回文需要O(N)的时间,结果得到O(N3)的复杂度,对于长一点的输入肯定会超时。

对于长度为一个字符的字符串,其自然为回文。对于长度为2的字符串,若str[0] == str[1],则为回文。
而对于长度为三的字符串,条件变为str[0] == str[2],长度为四,则若str[0] == str[3]且substr(1, 2)为回文。
由此看出,若要str[0, N]为回文,必须str[1, N-1]为回文,且str[0] == str[N]。
因此用动态规划求解,子问题就是str[i, j] <- str[i+1][j-1],得到递归方程:

dp[i, i] = true;
dp[i, i+1] == str[i] == str[i+1];
dp[i, j] = dp[i+1][j-1] && str[i] == str[j];
i, j 属于[0, N],得到O(N2)的解法。


点击(此处)折叠或打开

  1. class Solution {
  2. public:
  3.     string longestPalindrome(string s) {
  4.         int n = s.length();
  5.         bool dp[1000][1000] = { false };
  6.         int longest, begin;
  7.         int i, j;
  8.         
  9.         for (i=0;i<n;i++)
  10.             dp[i][i] = true;
  11.         
  12.         longest = 1;
  13.         begin = 0;
  14.         for (i=0; i<n-1; i++) {
  15.             if (s[i] == s[i+1]) {
  16.                 dp[i][i+1] = true;
  17.                 longest = 2;
  18.                 begin = i;
  19.             }
  20.         }
  21.         
  22.         for (j=3; j<=n; j++) {
  23.             for (i=0; i<n-j+1; i++) {
  24.                 if (dp[i+1][i+j-2] && s[i]==s[i+j-1]) {
  25.                     dp[i][i+j-1] = true;
  26.                     if (longest < j) {
  27.                         longest = j;
  28.                         begin = i;
  29.                     }
  30.                 }
  31.             }
  32.         }
  33.         
  34.         return s.substr(begin, longest);
  35.         
  36.     }
  37. };

阅读(649) | 评论(0) | 转发(0) |
0

上一篇:leetcode 不能访问

下一篇:没有了

给主人留下些什么吧!~~