求最長回文子串

2021-10-03 11:43:14 字數 2288 閱讀 8214

要求:給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。

示例 1:

輸入: 「babad」

輸出: 「bab」

注意: "aba"也是乙個有效答案。

示例 2:

輸入: 「cbbd」

輸出: 「bb」

解法一:暴力求解法

思想:反轉 s,使之變成 s』。找到 s 和 s』之間最長的公共子串,這也必然是最長的回文子串。

理由:如果找兩個字串的公共子串,i指向第乙個字串,j指向第二個字串,用暴力求解法肯定就是i每走一步,j就不斷的從頭遍歷第二個字串,然後判斷是否相等。

j從前往後走,就相當於原字串從後向前走。

s=「abacdfgdcaba」 , s ′ =「abacdgfdcaba」:s 以及 s』 之間的最長公共子串為 「abacd」,顯然,這不是回文。所以我們要加乙個判斷條件就可以了。

暴力演算法的時間複雜度為o(n^3),在leetcode中跑步過去,僅供參考

//判斷乙個字串是不是回文

int ifplalindrome(char *s)

left++;

right--;

}return 1;

}//反轉字串

char *reverse(char *s, int count)

p[i] = '\0';

return p;

}char* longestpalindrome(char* s)

arr1[k] = '\0';

//判斷是不是回文子串

if (ifplalindrome(arr1))}}

}return arr;

}

解法二:動態規劃

在暴力求解法中,判斷子串用了很多重複的操作,動態規劃就是要盡量避免重複的操作。

s的長度為n,生成乙個n*n的二維陣列dp[1001][1001]

dp[i][j]    表示從s[i]到s[j]是否是回文

dp[i][i] = true 因為dp[i][i]一定是回文

在動態規劃中只需要記錄回文開始的位置和長度即可

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

空間複雜度:o(n^2) 

char* longestpalindrome(char* s)

//定義bool型別的dp,只能為true或false

bool dp[1001][1001];

memset(dp, 0, sizeof(dp));

dp[0][0] = 1;

for (int i = 1; i < len; i++)

int left = 0;

int right = 0;

int max = 0;

//k表示回文子串的長度

for (int k = 2; k <= len; k++)}}

}char *arr = (char *)malloc(sizeof(int) * (max * 2));

int i = 0;

for (; i <= max; i++)

arr[i] = '\0';

return arr;

}

解法三:中心擴充套件法

以某個元素為中心,分別計算偶數長度的回文最大長度和奇數長度的回文最大長度。

時間複雜度o(n^2)

char* longestpalindrome(char* s)

int start = 0;

int maxlen = 0;

//i表示中間元素下標

for (int i = 1; i < len; i++)

if (high - low - 1 > maxlen)

//奇數長度

low = i - 1; high = i + 1;

while (low >= 0 && high < len && s[low] == s[high])

if (high - low - 1 > maxlen)

}char *arr = (char *)malloc(sizeof(int) * (maxlen * 2));

int i = 0;

for (; i < maxlen; i++)

arr[i] = '\0';

return arr;

}

求最長回文子串

求最長回文子串,大概有以下幾種方法 1 錯誤!先翻轉再求最長公共子串 例如 abcdafdcba abcd x 即原串中包含翻轉串的子串時 2 暴力 遍歷每個字串,然後判斷是否是回文子串並記錄最長資訊 時間複雜度o n 3 3 動態規劃 時間複雜度o n 2 空間複雜度o n 2 dp i j 表示...

求最長回文子串

1.第一種方法 o n 2 動態規劃,用s i j 表示從i到j是最長回文字串,用乙個table i j 記錄字串從i到j是否為回文,這樣的話,從底部向上,table i i true 另外如果s i s i 1 則table i i 1 true,然後長度從3開始,如果s i 1 s j 1 則就...

求最長回文子串

利用中心擴充套件法求最長回文子串演算法複雜度為o 待改進 manacher方法,manacher 法將所有的字串全部變成奇數個字元。思想 回文子串一定是個中心對稱的圖形,有的對稱中心是乙個字母比如abcba,有的是對稱中心是兩個字母比如abba。所以需要分開進行 程式中會有體現 利用回文子串的這一特...