当前位置: 面试刷题>> 双胞胎字符串 (经典算法题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); ``` 这些示例代码均遵循了题目要求,并在每个示例中添加了排序步骤(或等价的比较逻辑)以确保输出的一致性。