Palindromic Substring:回文子串,即一个字符串从左向右写和从右向走写是一样的,或者说字符串是对称。
解决思路:遍历字符串,依次找到所有回文子串的中间位置,分别尝试往两边扩展到最大长度。取所有得到的回文子串中最长的。
一个回文子串的中间位置有两种可能,
1)形如----aa-----即s[i] == s[i-1]
2)形如----axa----即s[i] == s[i-2]
对于出现---aaa---即同时满足s[i] == s[i-1]和s[i] == s[i-2]时,分别按两种情形尝试扩展。
注意上述情形都不出现,即结果为单个字符串,最长回文串长度为1,如‘’abc‘’,结果为‘’a‘’或‘’b‘’或‘’c‘’
代码:
char* longestPalindrome(char* s){ int start = 0 ,end = 0; int i = 0,j = 0,k = -1,len = 0,maxLen = 0; char *res; res = (char *)malloc(1001*sizeof(char)); while(s[i] != '\0'){ if(i >= 2 && s[i] == s[i-2]){ j = i + 1; k = i - 3; while(s[j] != '\0' && k >=0 && s[j] == s[k]){ ++ j; -- k; } len = (j - 1) - (k + 1) + 1; if(len > maxLen){ start = k + 1; end = j - 1; maxLen = len; } } if(i >= 1 && s[i] == s[i-1]){ j = i + 1; k = i - 2; while(s[j] != '\0' && k >=0 && s[j] == s[k]){ ++ j; -- k; } len = (j - 1) - (k + 1) + 1; if(len > maxLen){ start = k + 1; end = j - 1; maxLen = len; } } ++ i; } if(maxLen > 0){ for(i=0;i<maxLen;++i){ res[i] = s[start+i]; } res[maxLen] = '\0'; }else{ res[0] = s[0]; res[1] = '\0'; } return res; }