您的位置:首页 > 其它

[leetcode] 5-Longest Palindromic Substring

2017-03-16 18:50 351 查看


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息