[leetcode] 5-Longest Palindromic Substring

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;
}



猜你喜欢

转载自blog.csdn.net/ljh0302/article/details/62432546