leetcode Day1

111 阅读1分钟

5. 最长回文子串

今天拼多多前端暑期实习一面代码题,当时的思路是每次去头或去尾后判断是否回文,面试官提示动态规划,没写出来。

  1. 中心扩散法
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)
}
  1. 动态规划
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
};