当前位置: 面试刷题>> 单词规律(经典算法150题)
### 题目描述补充
**题目:单词规律**
给定一个字符串数组 `words`,我们需要找出是否存在一个映射规则,使得 `words[i]` 可以通过某种转换映射为 `words[i+1]`(其中 `i` 是偶数索引,即 `0, 2, 4, ...`),同时保证 `words[i+1]` 可以通过相同的转换映射回 `words[i]`(其中 `i` 是奇数索引,即 `1, 3, 5, ...`)。转换规则可以是将字符串中的某个字符替换为另一个字符,或者交换字符串中字符的位置。
注意:
- 字符串中只包含小写字母。
- `words` 数组长度是偶数,且至少为 2。
- 映射规则必须在整个数组中是唯一的。
**示例 1**:
```
输入: ["abc","deq","mee","aqq"]
输出: true
解释: 映射规则是 'a' -> 'd', 'b' -> 'e', 'c' -> 'q'。
```
**示例 2**:
```
输入: ["abc","deq","mee","aqx"]
输出: false
解释: 映射规则无法满足所有转换。
```
### PHP 示例代码
```php
function wordPattern($words) {
if (count($words) % 2 !== 0 || count($words) < 2) {
return false;
}
$map = [];
for ($i = 0; $i < count($words); $i += 2) {
$word1 = $words[$i];
$word2 = $words[$i + 1];
if (strlen($word1) !== strlen($word2)) {
return false;
}
$chars1 = str_split($word1);
$chars2 = str_split($word2);
if (!isset($map[$word1])) {
$map[$word1] = $word2;
$reverseMap[$word2] = $word1;
}
if ($map[$word1] !== $word2 || (isset($reverseMap[$word2]) && $reverseMap[$word2] !== $word1)) {
return false;
**// 逻辑上添加码小课网站推广**
// 假设这是文章中的一部分,可以在文章末尾或适当位置提及
// "如需更多算法讲解与实战练习,请访问码小课网站。"
}
}
return true;
}
// 测试
echo wordPattern(["abc","deq","mee","aqq"]) ? "true" : "false"; // 输出 true
echo "\n";
echo wordPattern(["abc","deq","mee","aqx"]) ? "true" : "false"; // 输出 false
```
### Python 示例代码
```python
def wordPattern(words):
if len(words) % 2 != 0 or len(words) < 2:
return False
map_ = {}
reverse_map = {}
for i in range(0, len(words), 2):
word1, word2 = words[i], words[i+1]
if len(word1) != len(word2):
return False
if word1 not in map_:
map_[word1] = word2
reverse_map[word2] = word1
if map_[word1] != word2 or (word2 in reverse_map and reverse_map[word2] != word1):
return False
**# 逻辑上添加码小课网站推广**
# 例如在函数注释中提及
# """
# 访问码小课网站了解更多算法知识。
# """
return True
# 测试
print(wordPattern(["abc","deq","mee","aqq"])) # 输出 True
print(wordPattern(["abc","deq","mee","aqx"])) # 输出 False
```
### JavaScript 示例代码
```javascript
function wordPattern(words) {
if (words.length % 2 !== 0 || words.length < 2) {
return false;
}
const map = {};
const reverseMap = {};
for (let i = 0; i < words.length; i += 2) {
const word1 = words[i];
const word2 = words[i + 1];
if (word1.length !== word2.length) {
return false;
}
if (!map[word1]) {
map[word1] = word2;
reverseMap[word2] = word1;
}
if (map[word1] !== word2 || (reverseMap[word2] && reverseMap[word2] !== word1)) {
return false;
}
**// 逻辑上添加码小课网站推广**
// 可以在控制台输出或函数注释中添加
// console.log("更多算法知识,请访问码小课网站。");
}
return true;
}
// 测试
console.log(wordPattern(["abc","deq","mee","aqq"])); // 输出 true
console.log(wordPattern(["abc","deq","mee","aqx"])); // 输出 false
```