Given a pattern and a string str, find if str follows the same pattern.
Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str.
Examples:
- pattern = “abba”, str = “dog cat cat dog” should return true.
- pattern = “abba”, str = “dog cat cat fish” should return false.
- pattern = “aaaa”, str = “dog cat cat dog” should return false.
**
解题思路:
**
- 分别建立map和mapStr两个哈希表;
- map用于存储 pattern中不同字符对应的index;
- mapStr用于存储str中不同字符串对应的index,注意将str字符串存储与字符串数组strArr[]中;
- 依次遍历字符串pattern的i位置时,向map哈希表中加入key元素的同时比较对应位置的strArr[i]中字符串是否存在于mapStr哈希表中;并且mapStr[key]前一个位置处的index要与map[key]前一位置处的index相同;
具体实现如下
var wordPattern = function(pattern, str) {
if((!pattern.length&&str.length)||(pattern.length&&!str.length))//任何一个字符串为空,另一个不为空,都应该返回false
{
return false;
}
var map = {},
mapStr = {},
symbol,
len = pattern.length;
var strArr = str.split(” “);//将str字符串转换为字符数组
if(strArr.length !== len )
{
return false;
}
//建立哈希表 格式{b:[0,3],a[1,2]}
for(var i = 0; i < len; i++)
{
symbol = pattern.substr(i,1); //依次取出pattern中的元素symbol
var strEle = strArr[i];//取出字符数组中对应下标元素if(map[symbol]) //字符已存在哈希表中 { if(mapStr[strEle]) //对应查找mapStr数组中的strEle元素是存在 { var strIndexArr = mapStr[strEle]; //查找mapStr哈希表中strEle元素的下标数组 if((strIndexArr.length-1) !== (map[symbol].length-1))//比较mapStr[strEle]与map[symbol两个下标数组是否相同 { return false; } mapStr[strEle].push(i); map[symbol].push(i); //在哈希表中存储字符对应的下标 }else{ return false; } }else{ map[symbol] = []; map[symbol].push(i); if(!mapStr[strEle]) { mapStr[strEle] = []; mapStr[strEle].push(i); }else{ return false; } }
}
// for(var j=0,lenArr=strArr.length;j
这里写代码片