最大字符串配对数目

标签: 数组 哈希表 字符串 模拟

难度: Easy

给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。

如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配:

  • 字符串 words[i] 等于 words[j] 的反转字符串。
  • 0 <= i < j < words.length

请你返回数组 words 中的 最大 匹配数目。

注意,每个字符串最多匹配一次。

示例 1:

输入:words = ["cd","ac","dc","ca","zz"]
输出:2
解释:在此示例中,我们可以通过以下方式匹配 2 对字符串:
- 我们将第 0 个字符串与第 2 个字符串匹配,因为 word[0] 的反转字符串是 "dc" 并且等于 words[2]。
- 我们将第 1 个字符串与第 3 个字符串匹配,因为 word[1] 的反转字符串是 "ca" 并且等于 words[3]。
可以证明最多匹配数目是 2 。

示例 2:

输入:words = ["ab","ba","cc"]
输出:1
解释:在此示例中,我们可以通过以下方式匹配 1 对字符串:
- 我们将第 0 个字符串与第 1 个字符串匹配,因为 words[1] 的反转字符串 "ab" 与 words[0] 相等。
可以证明最多匹配数目是 1 。

示例 3:

输入:words = ["aa","ab"]
输出:0
解释:这个例子中,无法匹配任何字符串。

提示:

  • 1 <= words.length <= 50
  • words[i].length == 2
  • words 包含的字符串互不相同。
  • words[i] 只包含小写英文字母。

Submission

运行时间: 16 ms

内存: 16.3 MB

class Solution:
    def maximumNumberOfStringPairs(self, words: List[str]) -> int:
        result = 0
        seen = set()
        for s in words:
            if s[::-1] in seen:
                result += 1
            else:
                seen.add(s)
        return result

Explain

此题解采用了哈希集合来记录已经遍历过的字符串。对每个字符串,首先检查其反转字符串是否已经存在于集合中,如果存在,则说明找到了一对可以匹配的字符串,因此结果计数加一。如果不存在,则将当前字符串加入到集合中,以便后续字符串进行匹配检查。这种方法利用了集合的高效查找特性,简化了匹配过程。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def maximumNumberOfStringPairs(self, words: List[str]) -> int:
        result = 0  # 用于记录匹配的对数
        seen = set()  # 用于存储已遍历的字符串
        for s in words:  # 遍历每个字符串
            if s[::-1] in seen:  # 检查当前字符串的反转是否在集合中
                result += 1  # 如果存在,匹配对数加一
            else:
                seen.add(s)  # 如果不存在,添加当前字符串到集合中
        return result  # 返回匹配的对数

Explore

在算法中,每个字符串只遍历一次,当找到一个匹配(即当前字符串的反转已在集合中)时,说明这对字符串已经形成了一个有效的配对。由于每个字符串只处理一次,将其从集合中移除是不必要的,因为不会再有其他字符串与之配对。此外,移除操作会增加额外的时间复杂度。

在这个特定的算法中,我们只关心字符串是否出现过,而不关心它们出现的次数。使用集合可以提供更快的查找速度和更简洁的代码实现。此外,使用集合可以自动处理重复字符串的情况,因为集合只存储唯一元素。

是的,算法考虑了这种情况。如果字符串'ab'和'ba'都出现在输入列表中,当处理到其中一个字符串,比如'ab'时,会将其加入集合。当处理到'ba'时,会发现'ab'的反转即'ba'已经在集合中,从而形成一个匹配对。因此,这种情况正确地被算作一对匹配。

在当前算法中,自反转字符串在首次遍历到时不会构成匹配对,因为其反转还未出现在集合中。这种字符串只有在出现至少两次时才可能被计为匹配对。例如,如果'zz'在数组中出现两次,第二次遍历到'zz'时,其反转(也是'zz')已经在集合中,这时才会计入一个匹配对。