多语言实现“找到字符串中所有字母异位词”的解决方案
摘要
在本文中,我们将探讨如何使用不同的编程语言解决“找到字符串中所有字母异位词”的问题。这个问题要求我们找出给定字符串 s
中所有与字符串 p
异位的子串,并返回这些子串的起始索引。我们将分析几种不同的算法,并提供 Python、Java 和 C++ 的实现。
1. 问题描述
给定两个字符串 s
和 p
,找到 s
中所有 p
的异位词的子串,并返回这些子串的起始索引。
2. 输入和输出格式
- 输入:字符串
s
和p
- 输出:异位词子串的起始索引列表
3. 示例
- 示例 1:
s = "cbaebabacd"
,p = "abc"
输出:[0, 6]
- 示例 2:
s = "abab"
,p = "ab"
输出:[0, 1, 2]
4. 约束条件
1 <= s.length, p.length <= 3 * 10^4
s
和p
仅包含小写字母
5. 算法分析
- 哈希计数法:使用哈希表(字典)来计数
p
中的字符频率,然后遍历s
并使用滑动窗口进行字符频率比较。
6. 多语言实现
我们将使用 Python、Java 和 C++ 来实现哈希计数法。
Python 实现
def findAnagrams(s, p):
from collections import Counter
p_count = Counter(p)
s_count = Counter(s[:len(p)-1])
result = []
# 滑动窗口
for i in range(len(p)-1, len(s)):
# 更新窗口的字符计数
s_count[s[i]] += 1
if i >= len(p):
s_count[s[i-len(p)]] -= 1
if s_count[s[i-len(p)]] == 0:
del s_count[s[i-len(p)]]
# 如果计数匹配,则添加索引到结果
if s_count == p_count:
result.append(i - len(p) + 1