当前位置: 面试刷题>> 子串字谜 (经典算法题500道)


**题目描述补充**: 题目名称:子串字谜(Substring Puzzle) 题目描述:给定一个字符串`s`和一个目标字符串`t`,请找出`s`中所有不同的子串(连续的子序列),这些子串经过重新排列后可以组成`t`。返回这些符合条件的子串的起始索引。注意,同一个起始索引只应被计算一次,即使它对应多个不同的子串排列可以组成`t`。 **示例**: 输入: ``` s = "abcdeba" t = "abc" ``` 输出: ``` [0, 1, 6] ``` 解释: - 索引0开始的子串"abc"可以直接组成"abc"。 - 索引1开始的子串"bcdea"包含"abc"作为其子序列的排列。 - 索引6开始的子串"abc"也可以直接组成"abc"。 注意,虽然索引5开始的子串"eba"包含"a", "b", "c"这些字符,但它们不能重新排列成"abc",因此不被计入结果。 **PHP代码示例**: ```php function findSubstringIndices($s, $t) { $result = []; $targetCounts = array_count_values(str_split($t)); $n = strlen($s); $m = strlen($t); for ($i = 0; $i <= $n - $m; $i++) { $currentCounts = []; for ($j = 0; $j < $m; $j++) { $char = $s[$i + $j]; if (isset($currentCounts[$char])) { $currentCounts[$char]++; } else { $currentCounts[$char] = 1; } } if ($currentCounts == $targetCounts) { $result[] = $i; } } return $result; } // 示例 $s = "abcdeba"; $t = "abc"; $indices = findSubstringIndices($s, $t); print_r($indices); ``` **注意**: 上述PHP代码示例未完全遵循题目要求,因为它检查的是子串的字符频率而非重新排列的可能性。完全符合题目要求的实现可能需要更复杂的逻辑,如使用回溯法或动态规划,但这会显著增加实现的复杂度。 **Python代码示例**: Python的示例将更复杂,因为直接检查所有可能的子串排列效率很低。通常,可以使用哈希表来简化字符频率的检查,但完全验证所有可能的排列需要更高级的技术(如使用回溯或深度优先搜索)。 **JavaScript代码示例**: JavaScript示例同样面临效率问题,这里提供一个简化的版本,仅检查字符频率: ```javascript function findSubstringIndices(s, t) { const targetCounts = {}; const result = []; for (let char of t) { targetCounts[char] = (targetCounts[char] || 0) + 1; } const n = s.length; const m = t.length; for (let i = 0; i <= n - m; i++) { const currentCounts = {}; for (let j = 0; j < m; j++) { const char = s[i + j]; if (currentCounts[char]) { currentCounts[char]++; } else { currentCounts[char] = 1; } if (currentCounts[char] > targetCounts[char] || !targetCounts[char]) { break; // 提前结束内层循环,因为当前子串不可能组成t } } // 这里简化为只检查频率相等的情况,未进行全排列检查 if (Object.keys(currentCounts).length === Object.keys(targetCounts).length) { let isValid = true; for (let key in currentCounts) { if (currentCounts[key] !== targetCounts[key]) { isValid = false; break; } } if (isValid) { result.push(i); } } } return result; } // 示例 const s = "abcdeba"; const t = "abc"; const indices = findSubstringIndices(s, t); console.log(indices); ``` **注意**: 上述JavaScript代码示例也简化了问题,仅通过字符频率来检查,并未真正验证所有可能的子串排列。完全按照题目要求实现可能需要更复杂的算法。 **码小课提示**: 码小课网站中有更多关于字符串处理、算法和数据结构的相关内容分享,欢迎大家学习交流。
推荐面试题