前端算法-单词规律

840 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第43天,点击查看活动详情

题目

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

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

思路一

我们这里可以使用Map进行实现,先声明一个matchMap变量,它的值是Map数据结构的实例,然后在声明一个变量patternArr,它的值是我们对形参pattern使用split方法的返回的数组,然后在声明一个sArr变量,对形参s使用split方法将其返回的数组赋值给sArr变量,然后进行判断当前patternArr数组和sArr数组数据长度是否一致,如果不一致直接返回false,然后对patternArr数组进行循环,在循环中声明pItem变量和sItem变量,他们存储的分别是当前patternArr数组的某一项和当前sArr数组的某一项,然后我们使用Set数据结构中的values方法获取到matchMap变量中的所有value值,在使用Array.from方法将其转换成数组,然后在使用Set数据结构中has方法和数组中的includes方法判断一下当前的pItem变量和sItem变量是否存在于matchMap变量中或者valuesArr数组中,如果存在则返回false,不存在且key值不存在于matchMap变量中则使用set方法把pItem变量当作key,sItem变量当作value存储到matchMap变量中,接下来在判断如果sItem变量不存在且key存在于matchMap变量中返回false,如果最后都没有返回,则直接返回true

var wordPattern = function(pattern, s) {
    let matchMap = new Map()
    let patternArr = pattern.split('')
    let sArr = s.split(' ')
    if(patternArr.length!=sArr.length){
        return false
    }
    for(let i = 0;i<patternArr.length;i++){
        let pItem = patternArr[i]
        let sItem = sArr[i]
        let valuesArr = Array.from(matchMap.values())
        if(!matchMap.has(pItem)&&valuesArr.includes(sItem)){
            return false
        }else if(!matchMap.has(pItem)){
            matchMap.set(pItem,sItem)
        }else if(sItem!=matchMap.get(pItem)){
            return false
        }
    }
    return true
};