单词规律


单词规律

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
给定一种规律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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
思路:
将规律pattern根据每个字符分成数组,将s根据每个空格分成数组
先判断两个数组长度是否相同,不同返回false
将两个数组使用array_combine分别左右key和value 形成两个新的数组
判断两个新的数组长度是否相同,不同返回false
将第二个数组使用array_flip交换key和value,比较新的数组和第一个数组是否完全相同,不同返回false

代码:
/**
* @param String $pattern
* @param String $s
*
* @return Boolean
*/
function wordPattern($pattern, $s)
{
// 字符串转数组
$map1 = str_split($pattern);
$map = explode(' ', $s);

// 长度不一致,返回false
if (count($map1) != count($map)) {
return false;
}

// 互相作为下标形成新数组
$mp = array_combine($map1, $map);
$mp2 = array_combine($map, $map1);

// 长度不一致,返回false
if (count($mp) !== count($mp2)) {
return false;
}

// 反转后的数组必须与另一个数组完成相同
$mp2 = array_flip($mp2);

return $mp === $mp2;
}

解法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
思路:
将规律pattern根据每个字符分成数组,将s根据每个空格分成数组
先判断两个数组长度是否相同,不同返回false
创建一个新的数组map
遍历pattern数组,判断是否在map中已经存在了相同的下标,如果存在,判断,下标对应的值是否和s数组的值相同,不同返回false
如果不存在,判断s数组的值是否已经存在map中,如果存在,证明s值对应到了另一个pattern值上,返回false
每次遍历记录到map中

代码:
/**
* @param String $pattern
* @param String $s
*
* @return Boolean
*/
function wordPattern($pattern, $s)
{
// 字符串转数组
$map1 = str_split($pattern);
$map2 = explode(' ', $s);

// 长度不一致,返回false
if (count($map1) != count($map2)) {
return false;
}

$map = [];
foreach ($map1 as $k => $value) {
// 如果存在key
if (isset($map[$value])) {
// 如果key对应的值与map2中的值不同,返回false
if ($map[$value] != $map2[$k]) {
return false;
}
} else {
// 如果不存在key,但map2中值却已经存在数组中,证明map2中的值被其他key对应,返回false
if (in_array($map2[$k], $map)) {
return false;
}
}

$map[$value] = $map2[$k];
}

return true;
}