LeeCode-刷题日记-Day20

290. 单词规律

思路:双哈希表,用pattern的字母映射到s的单词,再用s 的单词映射到pattern的字母。如果有一个不满足则返回不成立。

/**
 * @param {string} pattern
 * @param {string} s
 * @return {boolean}
 */
var wordPattern = function(pattern, s) {
    const word2ch = new Map();
    const ch2word = new Map();
    const words = s.split(' ');
    if(pattern.length!==words.length)
        return false;
    for(const [i,word] of words.entries()){
        const ch = pattern[i];
        if(word2ch.has(word)&&word2ch.get(word)!==ch || ch2word.has(ch)&&ch2word.get(ch)!==word)    return false;
        word2ch.set(word,ch);
        ch2word.set(ch,word);
    }
    return true;
};

763. 划分字母区间

第一次遍历整个字符串,获得每个字符在当前字符串中最后一次出现的位置。

第二次遍历字符串,标记一个end,让end等于当前字符对应的最后位置,如果当i等于end的时候,此处就是分割点。将其长度end-start+1加入数组中。

/**
 * @param {string} s
 * @return {number[]}
 */
var partitionLabels = function(s) {
    let last = new Array(26).fill(0);
    for(let i =0;i<s.length;i++){
        last[s.charCodeAt(i)-97]=i;
    }
    let pattern=[];
    let start=0,end=0;
    for(let i =0;i<s.length;i++){
        end=Math.max(end,last[s.charCodeAt(i)-97]);
        if(i===end){
            pattern.push(end-start+1);
            start=end+1;
        }
    }
    return pattern;
};