题目描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
解法
//以left,right的中心,向两边扩展的回文串长度 int expandCenter(string & s, int left, int right) { if (left < 0 || left > right || right >= s.size()) return 0; int l = left, r = right; while (l >=0 && r < s.size() && s[l] == s[r]) { l--; r++; } return r - l - 1; //回文串长度 } //解法:中心扩展法 //时间复杂度:O(N*N), 空间复杂度:O(1) int getLongestPalindrome(string s, int n) { if (s.size() <= 1) return s.size(); int maxLen = 0, left = 0, right = 0; //回文串的中心位置有两类: aa(aa之间的位置), aba(b位置) //遍历字符串,每个位置i, 构造两个中心位置,向左右扩展,看起能到达的最长回文长度。 for (int i = 0; i < s.size() - 1; i++) { int len1 = expandCenter(s, i, i); int len2 = expandCenter(s, i, i+1); if (len1 > maxLen) { maxLen = len1; left = i - len1/2; right = i + len2/2; } if (len2 > maxLen) { maxLen = len2; left = i - (len2-1)/2; right = i + (len2-1)/2; } } return maxLen; }