【LeetCode题解】反转字符串配对问题:最大匹配数目解析与实现
在算法面试中,字符串处理题型常常出现,其中“字符串反转匹配”的问题既考察了字符串操作的熟练度,也涉及了哈希表与贪心思想的灵活运用。
今天我们就来聊聊这道题:
题目描述:
给你一个下标从 0 开始的字符串数组 words,其中每个字符串都是互不相同的。如果存在两个字符串 words[i] 与 words[j],满足:
words[i]等于words[j]的反转字符串,- 且
0 <= i < j < words.length,
那么我们称它们可以匹配。
每个字符串最多匹配一次,请返回数组 words 中的最大匹配数目。
🔍 示例说明
举个例子,我们输入如下数组:
words = ["ab", "ba", "cd", "dc", "ee"]
可以观察到:
"ab"和"ba"是一对反转匹配;"cd"和"dc"是另一对;"ee"自身反转后仍是"ee",但它没有第二个"ee"可配对,所以不能匹配。
因此,最大匹配数为 2。
💡 解题思路
这道题的核心是:高效地找出反转字符串是否存在,并避免重复使用同一个字符串。
我们采用如下策略:
- 使用一个
set存储当前未被匹配的字符串; - 遍历每个字符串
word,计算它的反转rev = word[::-1]; - 如果
rev已存在于set中,说明找到一对匹配,计数加一; - 否则,将
word放入set中等待未来可能的匹配。
这种方法的时间复杂度是 O(n),空间复杂度是 O(n),效率非常高。
✅ 解法一:函数实现版(面试通用)
def max_matching_pairs(words):
seen = set()
count = 0
for word in words:
rev = word[::-1]
if rev in seen:
count += 1
seen.remove(rev)
else:
seen.add(word)
return count
调用示例:
print(max_matching_pairs(["ab", "ba", "cd", "dc", "ee"])) # 输出 2
✅ 解法二:面向对象形式(LeetCode风格)
如果你在刷 LeetCode,可以封装成类的形式:
class Solution(object):
def maximumNumberOfStringPairs(self, words):
"""
:type words: List[str]
:rtype: int
"""
st = set()
ans = 0
for word in words:
if word[::-1] in st:
ans += 1
st.remove(word[::-1])
else:
st.add(word)
return ans
同样的调用方式:
sol = Solution()
print(sol.maximumNumberOfStringPairs(["ab", "ba", "cd", "dc", "ee"])) # 输出 2
🔧 扩展:如果你想知道都有哪些配对?
只需稍作修改即可:
def matching_pairs_with_details(words):
seen = set()
pairs = []
for word in words:
rev = word[::-1]
if rev in seen:
pairs.append((rev, word))
seen.remove(rev)
else:
seen.add(word)
return pairs
输出:
print(matching_pairs_with_details(["ab", "ba", "cd", "dc", "ee"]))
# 输出:[('ab', 'ba'), ('cd', 'dc')]
✨ 总结
- 本题考察了字符串反转、哈希集合的应用,以及如何避免重复匹配;
- 核心技巧是:使用哈希集合记录未匹配的字符串;
- 时间复杂度为 O(n),是最优解之一;
- 除了解最大匹配数外,也可以扩展功能来输出配对详情。
如果你喜欢这道题的分析,欢迎点赞收藏支持一下!也可以留言分享你对这类“字符串匹配”问题的看法和技巧 🙌
384

被折叠的 条评论
为什么被折叠?



