/*
* 最長迴文子串
* 動態規劃 O(n^2)
*/
public class Solution {
public String longestPalindrome(String s) {
char[] chars = s.toCharArray();
int longest = 0, start = 0,end = 0;
int len = s.length();
boolean[][] mem = new boolean[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (i >= j) {
mem[i][j] = true;
} else {
mem[i][j] = false;
}
}
}
for (int j = 1; j < len; j++) {
for (int i = 0; i<j; i++) {
if (chars[i] == chars[j]) {
mem[i][j] = mem[i+1][j-1];
int currLen = j-i+1;
if (mem[i][j] == true && longest<currLen) {
longest = currLen;
start = i;
end = j;
}
}
else {
mem[i][j] = false;
}
}
}
return s.substring(start, end+1);
}
}
【leetcode with java】5 Longest Palindromic Substring
【分析】該問題的最優解可以從局部的最優解導出,且計算過程中存在大量重複計算,顯然是要用動態規劃了。
用二維布爾數組mem[][]記錄每個子串是否爲迴文,mem[i][j]表示第i個字符到第j個字符間的子串是否爲迴文。
初始化:當i>=j時mem[i][j] =true, i=j時就一個字符必定爲迴文,i<j時設爲true是爲了當S[i]=S[j]且j=i+1(S表示原字符串)時能夠以j>i+1的情況一樣處理。
過程:若S[i] == S[j]則mem[i][j] = mem[i+1][j-1],否則mem[i][j] = false
【上碼】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.