这里主要采用的是中心扩展法,即将整个字符串遍历,因为中心可能是单个字母,也可能是类似于abbc这样的两个字母的,所以需要对其进行分情况讨论:
如果是单个字母的时候,有n个情况,如果是两个字母的时候,有n-1种情况。所以合起来就是2n-1中情况
接下来对每个中心进行扩展然后检验,最后求出其中最长的回文串。
由其中心确定左右开始的位置,然后用substr函数直接相减就得出了需要的字符串。
实现代码如下:
1 class Solution { 2 public: 3 int expandAroundCenter(string s, int left, int right) 4 { 5 int L=left, R=right; 6 while(L>=0&&R<s.length()&&s[L]==s[R]) 7 { 8 L--; 9 R++; 10 } 11 return R-L-1; 12 } 13 14 string longestPalindrome(string s) { 15 if(s.length() < 1) 16 { 17 return ""; 18 } 19 int start =0,end =0; 20 for(int i = 0; i<s.length();i++) 21 { 22 int len1 = expandAroundCenter(s,i,i); 23 int len2 = expandAroundCenter(s,i,i+1); 24 int len = max(len1,len2); 25 if(len > end - start) 26 { 27 start = i - (len-1)/2; 28 end = i + (len)/2; 29 } 30 }return s.substr(start,end - start +1); 31 } 32 33 };
最终时间复杂度为O(n^2)
合并两个有序链表