2744. 最大字符串配对数目

【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),是最优解之一;
  • 除了解最大匹配数外,也可以扩展功能来输出配对详情。

如果你喜欢这道题的分析,欢迎点赞收藏支持一下!也可以留言分享你对这类“字符串匹配”问题的看法和技巧 🙌

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值