题目
给定一种规律
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
};
坚持努力,无惧未来!