Leetcode 5. Longest Palindromic Substring

最长回文子串

问题描述

给一个字符串,寻找到他的最长的回文子串。
回文:即正反顺序读取结果相同的字符串,如:'aba', 'af4fa'这样子的字符串。
现给出指定字符串,要求返回其最长的回文子串,如有多个长度相等,则返回其中任意一个即可。

解题思路

对于字符串s

用一个f(i,j)表示从i到j是否回文
i == j, 那么f(i,j) = 1
2. i + 1 == j, 那么f(i,j) = s[i] == s[j]
3. i + 1 < j, 那么f(i,j) = s[i] == s[j] && f(i+1, j-1)

递归

最开始一看,哇f(n) 与 f(n - 1) 构成关系,然后加上终止条件,用递归!emmm然后就发现递归好像重复计算了很多次,浪费了一堆堆空间。

动规

循环是可以的

循环顺序 以len=8为例子
0 0
0 1 | 1 1
0 2 | 1 2 | 2 2
0 3 | 1 3 | 2 3 | 3 3
0 4 | 1 4 | 2 4 | 3 4 | 4 4
0 5 | 1 5 | 2 5 | 3 5 | 4 5 | 5 5
0 6 | 1 6 | 2 6 | 3 6 | 4 6 | 5 6 | 6 6
0 7 | 1 7 | 2 7 | 3 7 | 4 7 | 5 7 | 6 7 | 7 7

最开始有种担心,访问f(i,j)的时候如果f(i+1, j-1)还没有计算出来就出错了。看上表,j-1一定是上一行的,所有必定是计算过的。

代码

class Solution {
public:
  string longestPalindrome(string s) {
    int len = s.size();
    if (len == 0) return "";
    int max = 0;
    int start = 0;
    int end = 0;
    int p[len][len];
    memset(p, 0, len * len * sizeof(int));  // 值得注意的是memset第三个参数是字节数
    for (int i = 0; i < len; i++) {
      for (int j = 0; j < i ; j++) {
        // 处理2,3两种情况,先判断s[i] == s[j]如果i - j != 1 就还要看 p[j + 1][i - 1]
        p[j][i] = (s[j] == s[i]) &&  ((i - j == 1) || p[j + 1][i - 1]);
        if (p[j][i] && max < i - j + 1) {
          start = j;
          end = i;
          max = i - j + 1;
        }
      }
      // 处理第一种情况
      p[i][i] = 1;
    }

    return s.substr(start, end - start + 1);
  }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值