5. 最长回文子串
今天拼多多前端暑期实习一面代码题,当时的思路是每次去头或去尾后判断是否回文,面试官提示动态规划,没写出来。
- 中心扩散法
var longestPalindrome = function(s) {
let res=''
for(let i=0;i<s.length;i++){
//奇数
let str1=getPalindrome(s,i,i)
//偶数
let str2=getPalindrome(s,i,i+1)
res=res.length<=str1.length?str1:res
res=res.length<=str2.length?str2:res
}
return res
};
const getPalindrome=function(s,l,r){
while(l>=0 && r<s.length && s[l]===s[r]){
l--
r++
}
return s.slice(l+1,r)
}
- 动态规划
var longestPalindrome = function(s) {
//初始化dp
let dp=new Array(s.length).fill(0)
for(let i=0;i<s.length;i++){
dp[i]=new Array(s.length).fill(0)
}
//dp[i][j] 表示第i起结束第j的字符串,是否是最长回文子串 true null false
//dp[i][j] = dp[i+1][j-1] && s[i] == s[j]
for(let j=0;j<s.length;j++){
//i>j时字符串不存在
for(let i=0;i<=j;i++){
if(j-i===0)dp[i][j]=true
else if(j-i===1){
dp[i][j]=s[i]===s[j]
}
else if(j-i>=2){
dp[i][j]=dp[i+1][j-1] && s[i]===s[j]
}
}
}
let res='',l=0
for(let i=0;i<dp.length;i++){
let lindex=dp[i].lastIndexOf(true)
if(lindex-i+1>l){
l=lindex-i+1
res=s.slice(i,i+l)
}
}
return res
};
728. 自除数
每日一题打卡,直接模拟。
var selfDividingNumbers = function(left, right) {
let res=[]
let f=true
for(let i=left;i<=right;i++){
let arr=i.toString().split('').map(j=>j*1)
if(arr.length===1){
res.push(i)
continue
}
if(arr.indexOf(0)!==-1){
continue
}
for(let j=0;j<arr.length;j++){
f=true
if(i%arr[j]!=0){
f=false
break
}
}
if(f){
res.push(i)
}
}
return res
};