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

题意:

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

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

示例1:

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

示例 2:

输入:pattern = “abba”, s = “dog cat cat fish
输出: false

示例 3:

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

提示:

  • 1 <= pattern.length <= 300
  • pattern 只包含小写英文字母
  • 1 <= s.length <= 3000
  • s 只包含小写英文字母和 ' '
  • s 不包含 任何前导或尾随对空格
  • s 中每个单词都被 单个空格 分隔

题目来源: https://leetcode.cn/problems/word-pattern/description/

解题方法:

方法一: 将对应字符串和单词转换成纯数字比较(例如:abba => 0110)

/**
 * @param String $pattern
 * @param String $s
 * @return Boolean
 */
function wordPattern($pattern, $s) {
    // 把pattern转变为对应的数字(以初次出现的位置做值),abba => 0110
    $pattern_arr = [];
    for($i = 0; $i < strlen($pattern); $i++){
        $pattern_arr[$i] = strpos($pattern, $pattern[$i]);
    }
    // 将s 单词分割成数组
    $s_arr = explode(" ", $s);
    $s_string_arr = [];
    //同理转换为数字做对比
    foreach($s_arr as $key => $value){
        if(!isset($tmp[$value])){   //如果单词没有出现过,填充到数组
            $s_string_arr[$key] = $key; 
            $tmp[$value] = $key;
        }else{                      //出现了,一首次出现的位置为值
            $s_string_arr[$key] = $tmp[$value];
        }
    }
    if($pattern_arr == $s_string_arr){
        return true;
    }
    return false;
}

方法二:比较对应字符和单词首次出现的位置

//比较对应字符和单词首次出现的位置
function wordPattern($pattern, $s) {
    $s_arr = explode(" ", $s);
    if(strlen($pattern) != count($s_arr)){
        return false;
    }
    for($i = 0; $i< strlen($pattern); $i++){
        if(array_search($s_arr[$i], $s_arr) != strpos($pattern, $pattern[$i])){
            return false;
        }
    }
    return true;
}

参考:
作者:Qiu
链接:https://leetcode.cn/problems/word-pattern/solutions/2182755/phpzuo-fa-array_searchfan-hui-di-yi-ge-j-ocfn/
来源:力扣(LeetCode)

方法三: 利用2个哈希表,记录模式和字符串的对应关系

function wordPattern($pattern, $s) {
    $arr = explode(" ", $s);    //提取s里面的单词
    $len = strlen($pattern);
    if(sizeof($arr) != $len){   //判断长度,不同直接返回FALSE
        return false;
    }

    $map1 = []; //模式到单词的哈希表
    $map2 = []; //单词到模式的哈希表
    for($i = 0; $i < $len; $i++){
        if(isset($map1[$pattern[$i]])){
            if($map1[$pattern[$i]] != $arr[$i]) //不匹配,返回false
                return false;
        }else if(isset($map2[$arr[$i]])){
            if($map2[$arr[$i]] != $pattern[$i]) //不匹配,返回false
                return false;
        }else{
            $map1[$pattern[$i]] = $arr[$i];    //记录哈希表
            $map2[$arr[$i]] = $pattern[$i];    //记录哈希表
        }
    }
    return true;    //结束返回true
}

参考:
作者:ifelse
链接:https://leetcode.cn/problems/word-pattern/solutions/494288/phpha-xi-biao-by-mek1986-7/
来源:力扣(LeetCode)

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值