算法从入门到放弃 -- leetcode新手村初级刷题(三)

69 阅读1分钟

一:最长公共前缀

截屏2022-12-10 下午9.41.34.png

方法一:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strArr) {
    const  fistStr = strArr[0]
    let len,targetStr = ''

    if (strArr.length===1) return fistStr

    for (let i = 0; i < fistStr.length; i++) {
        len = 1
        while (fistStr[i] === strArr[len][i]){
            len++
            if (len>=strArr.length){
                targetStr+=fistStr[i]
                break
            }
        }
        if (fistStr[i]!==targetStr[i])break
    }
    return targetStr
};

二:最长回文串

截屏2022-12-21 下午6.38.32.png 知识点:

什么是回文串?

正读和反读都是一样的字符序列是“回文串”,也就是一个对称的字符串。比如:‘abba’和‘abcba’是回文串,‘abcde’不是回文串。

回文串的本质:(可能除去一个字母外)其他字母出现偶数次

所以此题的解法:是统计每一个字母出现的次数,如果字母出现偶数次,那一定是回文串的组成成分。如果字母出现的次数是奇数,那么字母减一还存在也是回文串的组成成分。当前面的数值去掉之后,还存在奇数的字符,那么可以再加一。

用js的对象模拟哈希值

代码一

/**
 * @param {string} s
 * @return {number}
 */
var longestPalindrome = function(s) {
    let ans = 0
    let odd = false
    let strMap = {}
    for(let i = 0; i< s.length; i++){
        if(s[i] in strMap){
            strMap[s[i]] += 1
        }else{
            strMap[s[i]] = 1
        }
    }
    for(let key in strMap){
        if(strMap[key]%2 === 0){
            ans += strMap[key]
        }else{
            odd = true
            ans += strMap[key] - 1
        }
    }
    if(odd){
        ans += 1
    }
    return ans
};