Word Pattern

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

这里写代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值