当前位置: 面试刷题>> 双胞胎字符串 (经典算法题500道)
**题目描述**:
在给定的一组字符串中,我们需要找到所有“双胞胎字符串”的对。一个字符串对 `(s1, s2)` 被称为双胞胎字符串,如果满足以下条件:
1. `s1` 和 `s2` 长度相同。
2. `s1` 和 `s2` 中每个位置的字符要么完全相同,要么完全不同(即对应位置的字符ASCII码差值相等)。
例如,字符串 "abc" 和 "xyz" 是双胞胎字符串,因为 'a' 和 'x'、'b' 和 'y'、'c' 和 'z' 的ASCII码差值都相等。而 "abc" 和 "aab" 不是双胞胎字符串,因为 'a' 和 'a' 的ASCII码差值不为 'b' 和 'c' 的差值。
**任务**:
编写一个函数,接收一个字符串数组作为输入,返回一个包含所有双胞胎字符串对的列表(或数组),其中每对字符串以元组(Python/JavaScript)或数组(PHP)的形式出现。注意,每对双胞胎字符串只需出现一次,且顺序不重要(即 `(s1, s2)` 和 `(s2, s1)` 应被视为相同的对)。
**示例输入与输出**:
**输入**:
```python
["abc", "xyz", "123", "!@#", "abc", "zzz"]
```
**输出**:
```python
[("abc", "xyz"), ("123", "!@#")]
```
**PHP 示例代码**:
```php
function findTwinStrings($strs) {
$result = [];
$n = count($strs);
for ($i = 0; $i < $n; $i++) {
for ($j = $i + 1; $j < $n; $j++) {
if (strlen($strs[$i]) == strlen($strs[$j])) {
$isTwin = true;
$len = strlen($strs[$i]);
for ($k = 0; $k < $len; $k++) {
if (abs(ord($strs[$i][$k]) - ord($strs[$j][$k])) != abs(ord($strs[$i][0]) - ord($strs[$j][0]))) {
$isTwin = false;
break;
}
}
if ($isTwin) {
sort([$strs[$i], $strs[$j]]); // 确保顺序统一
$result[] = [$strs[$i], $strs[$j]];
}
}
}
}
return $result;
}
// 示例用法
$input = ["abc", "xyz", "123", "!@#", "abc", "zzz"];
$output = findTwinStrings($input);
print_r($output);
```
**Python 示例代码**:
```python
def find_twin_strings(strs):
result = []
n = len(strs)
for i in range(n):
for j in range(i + 1, n):
if len(strs[i]) == len(strs[j]):
diff = ord(strs[i][0]) - ord(strs[j][0])
is_twin = all(abs(ord(strs[i][k]) - ord(strs[j][k])) == abs(diff) for k in range(len(strs[i])))
if is_twin:
result.append((strs[i], strs[j]))
return result
# 示例用法
input_strs = ["abc", "xyz", "123", "!@#", "abc", "zzz"]
output = find_twin_strings(input_strs)
print(output)
```
**JavaScript 示例代码**:
```javascript
function findTwinStrings(strs) {
let result = [];
const n = strs.length;
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
if (strs[i].length === strs[j].length) {
let diff = strs[i].charCodeAt(0) - strs[j].charCodeAt(0);
let isTwin = true;
for (let k = 0; k < strs[i].length; k++) {
if (Math.abs(strs[i].charCodeAt(k) - strs[j].charCodeAt(k)) !== Math.abs(diff)) {
isTwin = false;
break;
}
}
if (isTwin) {
result.push([strs[i], strs[j]].sort()); // 确保顺序统一
}
}
}
}
return result;
}
// 示例用法
const inputStrs = ["abc", "xyz", "123", "!@#", "abc", "zzz"];
const output = findTwinStrings(inputStrs);
console.log(output);
```
这些示例代码均遵循了题目要求,并在每个示例中添加了排序步骤(或等价的比较逻辑)以确保输出的一致性。