【刷题打卡】290. 单词规律

125 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

1.描述

290. 单词规律

给定一种规律 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 中每个单词都被 单个空格 分隔

2.分析

字符串s和pattern是一一且唯一对应,可以使用map数据结构来承载对应关系。 重复的字符串不满足map的映射,那么就是不满足规律。 需要注意的是'abba'和'dog fish fish dog'这种情况,是不满足单词规律的

3.AC代码

var wordPattern = function(pattern, s) {
    //pattern和s的map映射,pattern是key,s是value
    let matchMap = new Map()
    //转换成数组
    let patternArr = pattern.split('')
    let sArr = s.split(' ')
    // 长度不一致直接返回false
    if(patternArr.length!=sArr.length)return false
    for(let i = 0;i<patternArr.length;i++){
        let pItem = patternArr[i]
        let sItem = sArr[i]
        // 获取生成的map中value值,新的value不能和之前的重复
        let valuesArr = Array.from(matchMap.values())
        //重复则返回false
        if(!matchMap.has(pItem)&&valuesArr.includes(sItem)){
            return false
        // 不重复且key不存在则添加
        }else if(!matchMap.has(pItem)){
            matchMap.set(pItem,sItem)
        // 不重复且key存在返回false
        }else if(sItem!=matchMap.get(pItem)){
            return false
        }
    }
    return true
};

参考

set()函数去重,zip()函数合并,首先判断两字符串长度是否相同(s.split(" ")分隔符),and后边是判断s字符串分割后与pattern字符串使用zip合并,再用set函数去重并且对比pattern和s源字符串去重后的的长度 - 单词规律 - 力扣(LeetCode)