介绍
当我们使用哈希法来解决问题时,有数组、set(集合)和map(映射)可供选择。
数组是一种顺序结构,元素与元素顺序存储。
集合的常用有std::set和std::unordered_set。set 底层实现依托于红黑树,所以查询效率或者说时间复杂度为O(log n);unordered_set底层实现依托于哈希表,通过哈希函数,生成索引,所以它的查询效率为O(1) 。
映射的常用有std::map和std::unordered_map。原理基本同上。
题目
1805. 字符串中不同整数的数目
给你一个字符串 word
,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34"
将会变成 " 123 34 8 34"
。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"
、"34"
、"8"
和 "34"
。返回对 word
完成替换后形成的不同整数的数目。
只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。
class Solution {
public:
int numDifferentIntegers(string word) {
string sum = "";
int token = 0;
set<string> s;
for (int i = 0; i < word.size(); i++) {
if (word[i] > 57) {
if (token == 1) {
for (int j = 0; j < int(sum.size())-1;) {
if (sum[0] == '0') {
sum.erase(sum.begin(),sum.begin()+1);
}else break;
}
s.insert(sum);
sum = "";
}
token = 0;
continue;
} else {
token = 1;
sum.push_back(word[i]);
}
if (i == word.size() - 1 && token == 1) {
for (int j = 0; j < int(sum.size())-1; j) {
if (sum[0] == '0') {
sum.erase(sum.begin(),sum.begin()+1);
}else break;
}
s.insert(sum);
}
}
return s.size();
}
};
383.赎金信
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。
如果可以,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> mag;
for (char cha:magazine) {
mag[cha]++;
}
for (char cha:ransomNote) {
mag[cha]--;
if (mag[cha] < 0) return 0;
}
return 1;
}
};
https://leetcode.cn/