5. Longest Palindromic Substring (Medium)

来源:互联网 发布:java中的工厂模式 编辑:程序博客网 时间:2024/05/29 12:33

原题目:
  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”

题目大意如下:
  从一个string中找到其最长的回文子串

解题思路:
  回文:正读和反读都相同的字符序列为“回文”。
  例如:
  123321,aaaa,aba等等
  
  首先,我们注意到具有重复字符的子串部分一定是回文。
  然后,如果一个字符串是回文那么它必定从中间开始左右是对称的。
  所以我们遍历整个字符串,对于每个字符i进行扩展:(设r为当前字符i的下一个字符,l为当前字符的前一个字符,初始时i == r == l)
  ①若s[r] == s[r + 1] ,当r < s.size() - 1, 即往右拓展时有重复字符时,++r ;
  ②若s[r] == s[l],即符合“对称”条件时,++r且- -l ;
  ③记录下区间长度(r - l + 1)和起始坐标start_index == l ,返回子串即可。
  第一第二种情况我们分别用一个while循环即可。
  注:我们并不需要往左拓展时检查有无重复字符,因为我们最外层的遍历是从左到右的。

代码如下:

class Solution {public:    string longestPalindrome(string s) {        if(s.empty()) return s ;        if(s.size() == 1) return s ;        int i = 0 ;        int max_len = 0 , start_index ;        //最外层循环遍历字符串        while(i < s.size()){            int l = i , r = i ;            //先确定有无重复的字符            while(r < s.size() - 1 && s[r + 1] == s[r] ) ++r ;            //while(l > 0 && s[l - 1] == s[l] ) --l ;            //往左右进行扩展            while(l > 0 && r < s.size() - 1 && s[l - 1] == s[r + 1]){                --l ;                ++r ;            }            //记录下区间长度和起始坐标            if( (r - l + 1) > max_len){                max_len = r - l + 1 ;                start_index = l ;            }             ++i ;        }        return s.substr(start_index , max_len) ;    }};

运行结果:
运行结果

算法分析:
  最外层一个while循环,内部两个循环其实是一个过程,最坏情况是内部两个循环又遍历一遍字符串,所以总体时间复杂度为O(n²)。

0 0
原创粉丝点击