演算法題:最長迴文子串(C#實現)
阿新 • • 發佈:2018-12-15
給定一個字串 s
,找到 s
中最長的迴文子串。你可以假設 s
的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
暴力法
最容易想到的就是暴力破解,求出每一個子串,之後判斷是不是迴文,找到最長的那個。
求每一個子串時間複雜度O(N^2), 判斷子串是不是迴文O(N),兩者是相乘關係,所以時間複雜度為O(N^3)。
public class Solution { public string LongestPalindrome(string s) { if (s == "") return s; int len = s.Length; int maxLen = 1; int start = 0; for(int i = 0; i < len; i++) { for(int j = i + 1; j < len; j++) { int tmp1 = i, tmp2 = j; while (tmp1 < tmp2 && s[tmp1] == s[tmp2]) { tmp1++; tmp2--; } if (tmp1 >= tmp2 && j - i + 1 > maxLen) { maxLen = j - i + 1; start = i; } } } return rs.Substring(start, maxLen); } }
中心擴充套件法
中心擴充套件就是把給定的字串的每一個字母當做中心,向兩邊擴充套件,這樣來找最長的子迴文串。演算法複雜度為O(N^2)。
需要考慮兩種情況:
長度為奇數的迴文串,比如a, aba, abcba
長度為偶數的迴文串,比如aa, abba
public class Solution { public string LongestPalindrome(string s) { if (s == "") return s; int len = s.Length; int maxlen = 1; int start = 0; for(int i = 0; i < len; i++) { int j = i - 1, k = i + 1; while (j >= 0 && k < len && s[j] == s[k]) { if (k - j + 1 > maxlen) { maxlen = k - j + 1; start = j; } j--; k++; } } for(int i = 0; i < len; i++) { int j = i, k = i + 1; while (j >= 0 && k < len && s[j] == s[k]) { if (k - j + 1 > maxlen) { maxlen = k - j + 1; start = j; } j--; k++; } } return s.Substring(start, maxlen); } }