动态规划方式进行实现, 动态规划在一些复杂的题中就是尤其中有规律的数推出来新的数据逐一获得最后的答案,减少不必要的循环。 本题: 比如说有个字符串 "absasba" 如果sas是回文 那么bsasb也一定是回文 absasba也一定是回文以此类推
var longestPalindrome = function (s) {
const length = s.length
//这里先创建一个数组用来存状态
var dp = new Array(length);
var maxStr = s[0];//最后结果的字符串,默认是第一个
//接下来就是进行从头到尾进行一次循环
for (let i = 0; i < length; i++) {
dp[i] = []
//这里是进行内层的反循环,一个正向找一个逆向找 然后进行比较
for (let j = i; j >= 0; j--) {
if (s[j] != s[i]) {//正向和逆向的不相等他肯定不是回文
dp[i][j] = false;
} else {
if (i - j < 2) {//这里如果字符串的长度要是1或者0他肯定是回文
dp[i][j] = true;
} else {
//如果他长度大于1,要看比他小的那个字符转是不是要是的话就是不是的话就不是
//例如:如果sas是回文 那么bsasb也一定是回文 absasba也一定是回文以此类推
dp[i][j] = dp[i - 1][j + 1];
}
}
//如果是真的话并且当前长度大于当前字符串的长度就要替换下字符串
if (dp[i][j] && i - j + 1 > maxStr.length) {
maxStr = s.slice(j, i + 1)
}
}
}
return maxStr
};
另一种动态规划做法
//这种和上面的主要部分是一样的,但是循环找的方式不同
var longestPalindrome = function (s) {
const length = s.length
//先开辟个二维数组空间为之后做准备
var dp = Array.from(new Array(length), () => new Array(length).fill(true))
var maxStr = s[0];
//这里循环是找字符串能有的长度
for (let L = 2; L <= length; L++) {
//对字符串进行循环查找找到长度为L的字符串
for (let i = 0; i < length; i++) {
//L= j - i + 1所以得出j的大小
var j = L + i - 1;
//要是j>=length是去不到的所以要跳出循环
if (j >= length) {
break;
}
//底下就和上面的同理
if (s[i] !== s[j]) {
dp[i][j] = false
} else {
if (j - i < 2) {
dp[i][j] = true
} else {
dp[i][j] = dp[i + 1][j - 1]
}
}
if (dp[i][j] && L > maxStr.length) {
maxStr = s.slice(i, j + 1)
}
}
}
return maxStr
};