Longest Palindromic Substring-----LeetCode

两种解法,动态规划和KMP变种

动态规划,类似于lcs的解法,数组flag[i][j]记录s从i到j是不是回文

首先初始化,i>=j时,flag[i][j]=true,这是因为s[i][i]是单字符的回文,当i>j时,为true,是因为有可能出现flag[2][1]这种情况,比如bcaa,当计算s从2到3的时候,s[2]==s[3],这时就要计算s[2+1] ?= s[3-1],总的来说,当i>j时置为true,就是为了考虑j=i+1这种情况。

接着比较s[i] ?= s[j],如果成立,那么flag[i][j] = flag[i+1][j-1],否则直接flag[i][j]=false

上代码

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4         int len = s.length(), max = 1, ss = 0, tt = 0;
 5         bool flag[len][len];
 6         for (int i = 0; i < len; i++)
 7             for (int j = 0; j < len; j++)
 8                 if (i >= j)
 9                     flag[i][j] = true;
10                 else flag[i][j] = false;
11         for (int j = 1; j < len; j++)
12             for (int i = 0; i < j; i++)
13             {
14                 if (s[i] == s[j])
15                 {
16                     flag[i][j] = flag[i+1][j-1];
17                     if (flag[i][j] == true && j - i + 1 > max)
18                     {
19                         max = j - i + 1;
20                         ss = i;
21                         tt = j;
22                     }
23                 }
24                 else flag[i][j] = false;
25             }
26         return s.substr(ss, max);
27     }
28 };

 

解法2:字符串s中的最长回文串是s的倒转s'和s的最长连续公共子串,代码就不写了

posted on 2013-07-22 20:51  赵乐ACM 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/dollarzhaole/p/3207364.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值