携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情
1.描述
给定一种规律 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
};