中心法求最长回文子串
还有一个更简单的方法可以使用O(N^2)时间、不需要额外的空间求最长回文子串。我们知道回文字符串是以字符串中心对称的,如abba以及aba等。一个更好的办法是从中间开始判断,因为回文字符串以字符串中心对称。一个长度为N的字符串可能的对称中心有2N-1个,至于这里为什么是2N-1而不是N个,是因为可能对称的点可能是两个字符之间,比如abba的对称点就是第一个字母b和第二个字母b的中间。因此可以依次对2N-1个中心点进行判断,求出最长的回文字符串即可。根据该思路可以写出下面的代码。
- string expandAroundCenter(string s,int L, int r)
- {
- int n = s.length();
- while (L>=0 && r<=n-1 && s[L]==s[r]) {
- L--; r++;
- }
- return s.substr(L+1, r-L-1); //返回以L+1为起点长度为r-L-1的字符串
- }
- string longestPalindrome3(string s)
- {
- int n = s.length();
- if (n == 0) return "";
- string longest = s.substr(0, 1);
- for (int i=0; i<n; i++) {
- string p1 = expandAroundCenter(s, i, i);
- //以位置i为中心的最长回文字符串考虑字符串长度为奇数的情况
- if (p1.length() > longest.length())
- longest = p1;
- string p2 = expandAroundCenter(s, i, i+1);
- //以i和i+1之间的位置为中心的最长回文字符串考虑字符串长度为偶数的情况
- if (p2.length() > longest.length())
- longest = p2;
- }
- return longest;
- }