5. 最長迴文子串---LeetCode
阿新 • • 發佈:2018-12-22
題目描述:
給定一個字串 s,找到 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; }