日新计划Leetcode之 290. 单词规律

85 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

290. 单词规律 - 力扣(LeetCode)

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

输入: pattern = "abba", str = "dog cat cat dog"
输出: true

示例 2:

输入:pattern = "abba", str = "dog cat cat fish"
输出: false

示例 3:

输入: pattern = "aaaa", str = "dog cat cat dog"
输出: false

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔

二、思路分析:

根据pattern的进行hash存储,存储过程中如果发现已经存储且与当前识别字符串不一致,则判定false 存储结束后验证是否有未遍历到的字符,如果有判定false 对hash中的结果进行计数,防止abba这种规则下,'dog dog dog dog'也可以通过的情况 同时判定规则对应的字符串为空的,认为s不满足规则,判定false

三、AC 代码:

/**
 * @param {string} pattern
 * @param {string} s
 * @return {boolean}
 */
var wordPattern = function (pattern, s) {
    let hash = {}
    let j = 0;

    for (let i = 0; i < pattern.length; i++) {
        let str = ''
        while (s[j] !== ' ' && j < s.length) {
            str += s[j]
            j++
        }
        j++
        if (!hash[pattern[i]]) {
            hash[pattern[i]] = str
            continue
        }
        // console.log(hash, j, pattern[i], str)
        if (hash[pattern[i]] !== str) {
            return false
        }
    }

    // console.log(hash, j, s.length)
    // 判断是否有多余的
    if (j < s.length) {
        return false
    }

    // 判断是否有重复的
    let tmp = {}
    for (let key in hash) {
        // 判断是否s中的单词不够
        if (hash[key] === '') {
            return false
        }
        if (!tmp[hash[key]]) {
            tmp[hash[key]] = 1
            continue
        }
        tmp[hash[key]] ++
    }

    // 计数查重
    for (let key in tmp) {
        if (tmp[key] > 1) {
            return false
        }
    }

    return true
};

四、参考:

索引 + 单双哈希表 + 元组 + 集合(6行代码,6解法,超100%) - 单词规律 - 力扣(LeetCode)

普通易懂的做法,双向哈希存值,确认11映射关系 - 单词规律 - 力扣(LeetCode)