Leetcode 题解系列(二)

来源:互联网 发布:燃烧热数据 编辑:程序博客网 时间:2024/06/07 23:43

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. 马拉车算法

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

原创粉丝点击