算法题解-单词规律

152 阅读3分钟

题目

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

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

题解

第一种

我们在函数中先声明了三个变量,n变量表示pattern的长度,arr变量是s按空格分割得到的字符串数组,map变量是一个Map对象,然后我们先判断模式的长度是否与拆分后的单词数组的长度相等,不相等则返回false,相等则使用循环进行循环判断map中是否存在当前循环中的字符,如果存在并且对应的单词不等于当前位置的单词,则返回false, 否则我们则将当前单词存入map中,循环结束后,我们清空map,在使用一个循环,遍历拆分后的单词数组中的每个单词,如果map中已经存在该单词并且对应的模式字符不等于当前位置的模式字符,则返回false,否则我们则将当前单词和对应位置的模式字符存入map中,如果上述匹配都通过了,那么我们则返回true即可

var wordPattern = function(pattern, s) {
    let n = pattern.length, arr = s.split(' '), map = new Map()
    if(n !== arr.length) return false
    for(let i = 0; i < n ; i++){
        if(map.has(pattern[i])){
            if(map.get(pattern[i]) !== arr[i]) return false
        }else{
        map.set(pattern[i], arr[i]) 
        }
    }
    map.clear()
    for(let i = 0; i < n ; i++){
        if(map.has(arr[i])){
            if(map.get(arr[i]) !== pattern[i]) return false
        }else map.set(arr[i], pattern[i]) 
    }
    return true
};

第二种

我们在函数中先使用split方法将待匹配的字符串s按空格分割成一个数组sSplit,然后我们检查模式字符串pattern的长度是否与sSplit数组的长度相等,如果不相等,我们则返回false,然后我们声明了一个toNumArr的函数,接受一个参数data,该函数的作用是将传入的数据转换成一个数字数组,然后在函数内部我们声明了两个空数组arr和set,用于存储转换后的数字数组和记录已经出现过的元素,然后我们使用循环遍历传入的数据data,在循环中我们获取到当前元素的值v并使用indexOf方法在set数组中查找该元素的索引,如果索引为-1,则表示该元素在set数组中不存在就将该元素添加到set数组中后再将当前循环的索引i添加到arr数组中,如果索引不为-1则表示该元素在set数组中已经存在,说明该元素重复出现我们就将set数组中该元素的索引添加到arr数组中,最后我们把函数返回的数据转换成数字数组arr,通过join方法将数组中的元素连接成一个字符串,然后调用toNumArr函数两次,分别传入模式字符串pattern和待匹配的字符串数组sSplit,并将返回的结果分别赋值给变量a和b,我们比较变量a和b的值是否相等,不相等则返回false,如果以上条件都不满足则直接返回true即可

var wordPattern = function (pattern, s) {
    const sSplit = s.split(' ')
    if (pattern.length !== sSplit.length) return false
    const toNumArr = function (data) {
        const arr = []
        const set = []
        for (let i = 0; i < data.length; i++) {
            const v = data[i]
            const index = set.indexOf(v)
            if (index === -1) {
                set.push(v)
                arr.push(i)
            } else arr.push(index)
        }
        return arr.join('')
    }
    const a = toNumArr(pattern)
    const b = toNumArr(sSplit)
    if (a !== b) return false
    return true
};

坚持努力,无惧未来!