Tag
【哈希表】【双重循环枚举】【字符串数组】【2024-01-17】
题目来源
解题思路
方法一:双重循环枚举
思路
枚举所有的字符串对,判断字符串对是否是反转的字符串对,如是则匹配的数量加一。
算法
class Solution {
public:
int maximumNumberOfStringPairs(vector<string>& words) {
int n = words.size();
int res = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (words[i][0] == words[j][1] && words[i][1] == words[j][0]) {
++res;
}
}
}
return res;
}
};
复杂度分析
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2),
n
n
n 为字符串数组 words
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
方法二:一次遍历
思路
我们对字符串数组进行一次遍历,对于遍历的字符串 words[i]
,如果字符串数组中存在对应的反转字符串则将匹配数量加一。
该方法首先需要用一个额外的空间来记录字符串数组出现的全部字符串。有两种方法实现,一是哈希集合存在字符串,二是使用 bool
数组来表示字符串。
第一种方法,对于比较方便得到反转字符串的语言,我们可以在哈希集合中存储字符串本身;对于其它语言,我们可以存储字符串的哈希值,改为判断 words[i]
的反转字符串的哈希值是否存在。哈希值需要保证不会冲突,本题中字符串的长度为 2
并且只包含小写字母,因此可以使用 100a+b
作为哈希值,其中 a
和 b
分别是两个字符的 ASCII
值。
第二种方法,维护一个
26
×
26
26 \times 26
26×26 的 bool
数组 seen
中。遍历字符串数组,如果当前遍历的字符串 s
在 seen
中,则匹配的数量加一;否则将 s
加入数组 seen
中,方便在后续遍历中,快速判断是否有能匹配的字符串。
哈希集合
class Solution {
public:
int maximumNumberOfStringPairs(vector<string>& words) {
int n = words.size();
int res = 0;
unordered_set<int> seen;
for (int i = 0; i < n; ++i) {
if (seen.count(words[i][1] * 100 + words[i][0])) {
++res;
}
seen.insert(words[i][0] * 100 + words[i][1]);
}
return res;
}
};
bool 数组
class Solution {
public:
int maximumNumberOfStringPairs(vector<string>& words) {
int res = 0;
bool seen[26][26]{};
for (auto&s : words) {
int x = s[0] - 'a';
int y = s[1] - 'a';
if (seen[y][x]) {
++res;
}
else {
seen[x][y] = true;
}
}
return res;
}
};
复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n),
n
n
n 为字符串数组 words
的长度。
空间复杂度: O ( n ) O(n) O(n),哈希集合方法占用的额外空间。bool 数组占用的额外空间为 26 × 26 26 \times 26 26×26。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。