let result = ""; for (let i = 0; i for (let j = i; j let sub = s.subStr(i, j+1); if (checkSubstring(sub)) { if (result.length result = sub; } } } }
两层循环套一个检查是否是回文串的函数,时间复杂度O(n3)
动态规划
最长的回文子串,去掉首尾肯定还是回文子串,于是可以从最短的回文子串开始一点点找到更长一点的回文子串
Array.prototype.setPush = function(val) { if (!this.some(x => x === val)) { this.push(val); } } String.prototype.searchAll = function(val) { let result = []; for (let i = 0; i let index = this.indexOf(val, i); if (index === -1) break; else { result.push(index); i = index+1; } } return result; } var lOngestPalindrome= function(s) { if (s === "") return ""; const length = s.length; let temp = []; // 将1长度和2长度的回文子串全部取出 for (let i = 0; i temp.setPush(s[i]); if (s[i] === s[i+1]) { temp.setPush(s[i]+s[i]); } } while (true) { let tempTwo = []; for (let i = 0; i let indexes = s.searchAll(temp[i]); for (index of indexes) { let a = index-1; let b = index+temp[i].length; if (s[a] === s[b] && s[a] !== undefined) { tempTwo.setPush(s.slice(a, b+1)); } } } if (tempTwo.length > 0) { temp = tempTwo; } else { let maybeMaxLength = temp[0].length; if (temp.some(x => x.length !== maybeMaxLength)) { for (x of temp) { if (x.length > maybeMaxLength) return x; } } return temp[0]; } } };
function expandAroundCenter(s, left, right) { let L = left, R = right; while(L >= 0 && R L--; R++; } return R - L - 1; } /** * @param {string} s * @return {string} */ var lOngestPalindrome= function(s) { if (s === null || s.length <1) return ""; let start = 0, end = 0; for (let i = 0; i let len1 = expandAroundCenter(s, i, i); let len2 = expandAroundCenter(s, i, i+1); let len = Math.max(len1, len2); if (len > end - start) { start = i - Math.floor((len - 1) / 2); end = i + Math.floor(len / 2); } } return s.substring(start, end+1); };