LeetCode 5最長迴文子串(java程式碼)
阿新 • • 發佈:2018-11-08
方法一:動態規劃
定義P(i,j):如果字串從i位置到j位置是迴文,P(i,j)=true;否則,P(i,j)=false;
那麼P(i,j)= P(i+1,j−1) && Si==Sj
首先初始化一字母和二字母的迴文:
P(i,i)=true P(i, i) = true P(i,i)=true
P(i,i+1)=(Si==Si+1)
然後找到所有三字母迴文,並依此類推…
複雜度分析
-
時間複雜度:O(n2)
-
空間複雜度:O(n2), 該方法使用 O(n2) 的空間來儲存表。
public String longestPalindrome(String s) { if(s == null || s.length() <= 1){ return s; } int len = s.length(); //flag[i][j]=true 表示子串i-j為迴文字串 boolean[][] flags = new boolean[1000][1000]; int start = 0; int maxlen = 0; for(int i=0; i<len; i++){ flags[i][i] = true; if(maxlen==0||maxlen==1){ start = i; maxlen = 1; } //相鄰的兩個字元相同 if( i<len-1 && s.charAt(i) == s.charAt(i+1)){ flags[i][i+1] = true; start = i; maxlen = 2; } } //m代表迴文子串長度,從3開始 for(int m = 3; m <= len; m++){ for(int i = 0; i <= len-m; i++ ){ //依次比較是否符合狀態轉移方程 int j = i+m-1; if(flags[i+1][j-1] && s.charAt(i)==s.charAt(j)){ flags[i][j] = true; start = i; maxlen = m; } } } return s.substring(start, start+maxlen); }
方法二:中心擴充套件演算法
事實上,只需使用恆定的空間,我們就可以在 O(n2)的時間內解決這個問題。
迴文中心的兩側互為映象。因此,迴文可以從它的中心展開
public String longestPalindrome(String s) { if (s == null || s.length() < 1) return ""; int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); int len2 = expandAroundCenter(s, i, i + 1); int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } private int expandAroundCenter(String s, int left, int right) { int L = left, R = right; while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) { L--; R++; } return R - L - 1; }
方法三
得到字串的逆序字串,將當前字串的子串和逆序字串對比,看逆序字串是否包含子串,並且當長度大於之前最長迴文串時,更新最長迴文串為當前子串
public static String getLongestSymmetryString(String s){
String reverseString = new StringBuffer(s).reverse().toString();
String res="";
int max = 0;
int start, end;
for(int i=0; i<s.length(); i++){
start = i;
for(end = s.length(); ; end--){
if(start >=end) break;
String substr = s.substring(start, end);
int temp = end - start;
if(temp>max && reverseString.contains(substr)) {
res=substr;
max = temp;
}
}
}
return res;
}