leetcode2744. 最大字符串配对数目

简介: leetcode2744. 最大字符串配对数目

题目

给你一个下标从 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] 只包含小写英文字母

解题方法1

遍历所有的nums,将遍历到的值排序,统一成一个key,声明一个字典,在字典中这个key 加一,最后遍历字典,如果某个key出现了k次,说明可以匹配k//2次,我们累加结果即可

复杂度1

时间复杂度:

遍历了一次所以是 O ( n ) O(n)O(n)

空间复杂度:

最多存储所有的数,所以是 O ( n ) O(n)O(n)

Code1

class Solution:
    def maximumNumberOfStringPairs(self, words: List[str]) -> int:
        d = defaultdict(int)
        ans = 0
        for i in words:
            x = str(sorted(list(i)))
            d[x] += 1
        for key,val in d.items():
            ans += val // 2
        return ans

解题方法2

我们可以优化上一种方法,不需要每次都生成key,只遍历一遍nums,将遍历到的字符串放入set集合中,在放入前判断这个字符串的反转字符串是否存在,如果存在,则结果加1

复杂度2

时间复杂度:

遍历了一次所以是 O ( n ) O(n)O(n)

空间复杂度:

最多存储所有的数,所以是 O ( n ) O(n)O(n)

Code2

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


目录
相关文章
|
6天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
6天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
10 0
|
20天前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
25天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
29天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
5天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
10 0
|
6天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法