题意:
给定一种规律 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)