Leetcode 题解系列(二)

Longest Palindromic Substring

题目要求
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"
Output: "bab"

Note: "aba" is also a valid answer.
Example:

Input: "cbbd"
Output: "bb"
题目分析
1. 最初想法

一个对称的串,与它的翻转是相同的。那么,最长的对称子串就是其与其翻转的最长公共部分,用最长公共子串来做就好了。
然而这是一个错误的方法(虽然可以通过)。由于最长公共的部分不一定是原先的部分的翻转,这里会出现过长的错误答案。举个栗子,串"abcdba","ab"会与翻转后的"ba"错误的匹配,这并不是我们想要的。
那么怎么解决呢?其实也很简单,对于得到的最长匹配做一下检查,判断是不是对称的就好。

2. 从中心向两侧扩展

对称子串的中心想两侧伸展,可以求得以这个为中心的最长对称子串。那么,对于所有中心进行一次遍历,那么就可以实现求得最长对称子串的方法。中心的数量是 2n1 ,这里要注意到,对称子串的中心,可能是字符(对应的子串长度为奇数),也可以是字符的间隔部分(对应的子串长度为偶数)。代码如下:

  string longestPalindrome(string s) {
    int start = 0, end = 0;
    for (int i = 0; i < s.size(); i++) {
      // 中间是字符
      int k = i, j = i;
      while (j >= 0 && k < s.size() && s[k] == s[j]) j--, k++;
      // 中间是字符间隔
      int len = k - j - 1;
      k = i + 1, j = i;
      while (j >= 0 && k < s.size() && s[k] == s[j]) j--, k++;
      len = std::max<int>(len, k - j - 1);
      if (len > end - start) {
        start = i - (len - 1) / 2;
        end = i + len / 2 + 1;
      }
    }
    return s.substr(start, end - start);
  }
3. 马拉车算法

从网上查得最优算法是马拉车算法,日后再更新吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值