LeetCode 2744.最大字符串配对数目

2024-02-21 11:36

本文主要是介绍LeetCode 2744.最大字符串配对数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

法一:直接模拟:

class Solution {
public:int maximumNumberOfStringPairs(vector<string>& words) {int ans = 0;for (int i = 0; i < words.size(); ++i){for (int j = i + 1; j < words.size(); ++j){if (words[i][0] == words[j][1] && words[i][1] == words[j][0]){++ans;break;}}}return ans;}
};

如果words长度长度为n,此算法时间复杂度为O(n 2 ^{2} 2),空间复杂度为O(1)。

法二:将法一中的比较过程改用标准库,更普适:

class Solution {
public:int maximumNumberOfStringPairs(vector<string>& words) {int ans = 0;for (int i = 0; i < words.size(); ++i){reverse(words[i].begin(), words[i].end());for (int j = i + 1; j < words.size(); ++j){if (words[i] == words[j]){++ans;break;}}}return ans;}
};

如果words长度长度为n,此算法时间复杂度为O(n 2 ^{2} 2),空间复杂度为O(1)。

法三:哈希表,由于words中各个元素都不相同,每当遍历到一个元素,在unordered_set中查找目标哈希值,然后将当前遍历到的元素的哈希值存入unordered_set中:

class Solution {
public:int maximumNumberOfStringPairs(vector<string>& words) {unordered_set<int> ui;int ans = 0;for (string &s : words){if (ui.find((s[1] << 8) + s[0]) != ui.end()){++ans;}ui.insert((s[0] << 8) + s[1]);}return ans;}
};

如果words长度长度为n,此算法时间复杂度为O(n),空间复杂度为O(n)。

法四:字典树,又称Trie、前缀树、单词查找树、前缀树,它利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较:

class Solution {
public:int maximumNumberOfStringPairs(vector<string>& words) {root = new TrieNode;int ans = 0;for (string &word : words){string reversedString = word;reverse(reversedString.begin(), reversedString.end());ans += search(root, reversedString);insert(root, word);}return ans;}private:class TrieNode{public:unordered_map<char, TrieNode *> children;int count = 0;};TrieNode *root;int search(TrieNode *root, string &s){for (char c : s){if (root->children.find(c) == root->children.end()){return 0;}root = root->children[c];}return root->count;}void insert(TrieNode *root, string &s){for (char c : s){if (root->children.find(c) == root->children.end()){root->children[c] = new TrieNode;}root = root->children[c];}++root->count;}
};

如果words的长度为n,每个word的平均长度为m(本题中m为常数2),则此算法时间复杂度为O(nm),空间复杂度最差为O(nm)。

这篇关于LeetCode 2744.最大字符串配对数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/731645

相关文章

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

python中字符串拼接的几种方法及优缺点对比详解

《python中字符串拼接的几种方法及优缺点对比详解》在Python中,字符串拼接是常见的操作,Python提供了多种方法来拼接字符串,每种方法有其优缺点和适用场景,以下是几种常见的字符串拼接方法,需... 目录1. 使用 + 运算符示例:优缺点:2. 使用&nbsjsp;join() 方法示例:优缺点:3

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自