题目描述:
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"
本题要我们找的是字符串中长度最长的“回文”(从左从右读都一样)。
解题记录:
根据“回文”“轴对称”的特点,可先找到回文的中心,再由中心向外扩张找长度和起始位置。
我一开始做的时候将中心分为两种:一种是"aa"这样的,一种是"aba"这样的。然后向外扩张寻找“回文”。
还有一种寻找中心的办法就是:以相同的字符组成的字符串为中心,像"baab"就以"aa"为中心,"baaaaa"就以"aaaaa"为中心。也就是第二个代码的办法。
我的代码:
1 class Solution { 2 public: 3 string longestPalindrome(string s) { 4 int beg=0,max=1,length=s.length(); 5 for(int i=0;i<length;i++){ 6 if(s[i]==s[i+1]){ 7 int j=1; 8 while(i-j>=0&&i+j+1<length){ 9 if(s[i-j]!=s[i+j+1]) 10 break; 11 j++; 12 } 13 if(2*j>max){ 14 max=2*j; 15 beg=i-j+1; 16 } 17 } 18 if(i<length-1&&s[i]==s[i+2]){ 19 int j=1; 20 while(i-j>=0&&i+j+2<length){ 21 if(s[i-j]!=s[i+j+2]) 22 break; 23 j++; 24 } 25 if(2*j+1>max){ 26 max=2*j+1; 27 beg=i-j+1; 28 } 29 } 30 } 31 return s.substr(beg,max); 32 } 33 };
优质解答:
1 class Solution { 2 public: 3 string longestPalindrome(string s) { 4 int beg=0,max=1,n=s.length(); 5 for(int i=0;i<n;i++){ 6 int left=i,right=i; 7 while(right<n-1&&s[right]==s[right+1]) right++; 8 while(left>0&&right<n-1&&s[left-1]==s[right+1]){ 9 left--; 10 right++; 11 } 12 if(right-left+1>max){ 13 beg=left; 14 max=right-left+1; 15 } 16 } 17 return s.substr(beg,max); 18 } 19 };