5. Longest Palindromic Substring(最长会文数)

引用自:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/

方法二:中心扩展法

我们观察到回文中心的两侧互为镜像。因此,回文可以从它的中心展开,并且只有 2n - 12n1 个这样的中心。
你可能会问,为什么会是 2n - 12n1 个,而不是 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)

猜你喜欢

转载自www.cnblogs.com/bspp1314/p/9392179.html