1. 程式人生 > >5. 最長迴文子串---LeetCode

5. 最長迴文子串---LeetCode

題目描述:

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 的最大長度為1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

第一種方法:暴力破解法

時間複雜度:O(n^3)

思想:找到所有的子串,判斷是否為迴文子串,找到最長的會問子串

找子串,需要兩層迴圈:O(n^2),判斷是否為迴文子串:O(n)。

程式碼:

#define _CRT_SECURE_NO_DEPRECATE 1
//暴力破解法
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int judge(char* left, char* right){
	while (left < right){
		left++;
		right--;
		if (*left != *right){
			return 0;
		}
	}
	return 1;
}


char* longestPalindrome(char* s) {
	int len = strlen(s);
	if (len == 0){ return s; }
	char* left = s;
	char* right = s + len - 1;
	int maxlen = 0;
	char* save = NULL;
	while (right!=s){
		for (left = s; left != right; left++){
			if (*left == *right){
				int ret = judge(left, right);
				if (ret == 1){
					if (maxlen < right - left + 1){
						maxlen = right - left + 1;
						save = (char*)malloc(sizeof(char)*(maxlen + 1));
						memcpy(save, left, maxlen);
						save[maxlen] = '\0';
					}
				}
			}
		}
		right--;
	}
	if (maxlen == 0){
		maxlen = 1;
		save = (char*)malloc(sizeof(char)*(maxlen + 1));
		memcpy(save, s, maxlen);
		save[maxlen] = '\0';
	}
	return save;
}

第二種方法:中心查詢法

時間複雜度:O(n^2)

思想:遍歷字串的每個字元---(O(n)),單核:從這個字元開始向兩邊遍歷,判斷是否為迴文子串。雙核:從這個字元開始向左遍歷,從下一個字元開始向右遍歷,判斷是否為迴文子串。---(O(n))

程式碼:

#define _CRT_SECURE_NO_DEPRECATE 1
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void judge(char* s, int len, int left, int right,int* pos, int* maxlen){
	while (left >= 0 && right < len && s[left] == s[right]){
		left--;
		right++;
	}
	if (*maxlen < right - left - 1){
		*pos = left + 1;
		*maxlen = right - left - 1;
	}
}
char* longestPalindrome(char* s) {
	int maxlen = 0;
	int pos = 0;
	int len = strlen(s);
	if (len < 2){
		return s;
	}
	int i = 0;
	for (i = 0; i < len; i++){
		judge(s, len, i, i,&pos, &maxlen);
		judge(s, len, i, i + 1,&pos, &maxlen);
	}
	char*save = (char*)malloc(sizeof(char)*(maxlen + 1));
	memcpy(save, s + pos, maxlen);
	save[maxlen] = '\0';
	return save;
}
int main()
{
	char* s = "babad";
	char* ret = longestPalindrome(s);
	printf("%s\n", ret);
	return 0;
}