最長迴文子串
暴力破解法
選出所有子字串可能的開始和結束位置,並檢驗它是不是迴文,時間複雜度為O(n^3),空間複雜度為O(1)
var longestPalindrome = function (s) {
var len = s.length;
if(len == 0){
return "";
}
let result = s[0];//1個字元也是迴文子串
for(let i=0; i<len; i++){
for(let j=i+1; j<len; j++){
let str = s.slice(i, j);
let restr = str.split('').reverse().join('');
if(str == restr){
result = str.length > result.length? str: result;
}
}
}
return result;
};
複製程式碼
動態規劃
var longestPalindrome = function (s) {
let len = s.length;
let result;
let dp = Array(len).fill(0).map(x=>Array(len).fill(0));
let i,j,L;
if(len<=1){
return s;
}
//只有一個字串的時候是迴文
for(i=0; i<len; i++){
dp[i][i] = 1;
result = s[i];
}
for(L = 2; L<=len; L++){
//L為當前所判斷的字串的長度,i是第一個字元的index,j是最後一個字元的index
for(i = 0; i<=len-L; i++){
//L = j - i + 1
j = L + i - 1;
//如果當前判斷字串符長度為2
if(L == 2 && s[i] == s[j]){
dp[i][j] = 1;
result = s.slice(i,i+L);
}
//當前判斷的字元長度不為2
//s[i] == s[j]判斷第一個字串和第二個字串是否相同
//dp[i+1][j-1] == 1判斷相關子串是否迴文
//當前字串長度為L,則需要判斷字串長度為L-2,首字元index為i+1,尾字元index為j-1的子串是否為迴文
else if(s[i] == s[j] && dp[i+1][j-1] == 1){
dp[i][j] = 1;
result = s.slice(i,i+L);
}
}
}
return result;
}
複製程式碼
emm不知道什麼演算法大概的想法就是先把字串變成長度為奇數,在字元間加上#,然後以每一個字元為中心,向左右擴散判斷是否是迴文子串
var longestPalindrome = function (s) {
var i = 0, pre, next;
if (s.length < 2) {
return s;
}
s = s.split('').join('#');
var len = s.length;
var result = s[len - 1];
while (i < len) {
for (pre = i - 1, next = i + 1; s[pre] == s[next] && s[pre] && s[next]; pre-- , next++) {
if (next - pre + 1 > result.length) {
result = s.slice(pre, next + 1);
}else if(next - pre + 1 == result.length && s[i] == '#'){
result = s.slice(pre, next + 1);
}
}
i++;
}
return result.split('#').join('');
};
複製程式碼
馬拉車
這個一直不能理解- -智商堪憂,附上鍊接給各位看官吧⬇