引用自:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/
方法二:中心扩展法
我们观察到回文中心的两侧互为镜像。因此,回文可以从它的中心展开,并且只有 2n - 12n−1 个这样的中心。
你可能会问,为什么会是 2n - 12n−1 个,而不是 nn 个中心?原因在于所含字母数为偶数的回文的中心可以处于两字母之间(例如 “abba”的中心在两个 b 之间)。
int expand_around_center(char *s,int left,int right,int len) { while(left >= 0 && right < len && s[left] == s[right]){ left--; right++; } return right-left-1; } char *longestPalindrome(char *s){ int left = 0; int right = 0; int len = 0; if(s == NULL || (len = strlen(s)) <= 1) return s; for(int i = 0;i < len;i++){ int len1 = expand_around_center(s,i,i,len); int len2 = expand_around_center(s,i,i+1,len); int max_len = len1 > len2 ? len1:len2; if(max_len > right-left){ left = i-(max_len-1)/2; right = i+max_len/2; } } int sub_len = right-left+1; char *res = (char *)malloc((sub_len + 1) * sizeof(char)); res[sub_len] = '\0'; strncpy(res,s+left,sub_len); return res; }
时间复杂度:O(n2)
空间复杂度:O(1)