KMP
链接:
主要就是将最长相等前后缀计算出来,这个比较简单,主要作用就是不浪费之前找到的匹配的数组,但是不理解为啥:
如果这个时候我设置文本串的5是c不是和前缀后面的b相同应该怎么办呢?有待考究hh
NO1初始化
NO2处理前后缀不相同的情况
NO3处理前后缀相同的情况
NO4更新NEXT
回顾哈希表
哈希表刷的太匆忙了,回顾一下
当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
哈希表:1.数组2.set3.map
一、使用数组来做哈希的题目,是因为题目都限制了数值的大小。
题目没有限制数值的大小,就无法使用数组来做哈希表了。
而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
此时就要使用另一种结构体了,set
set和multiset底层实现都是红黑树,unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复
if (nums_set.find(num) != nums_set.end())
二、很常用的一个式子在nums_set中查找num,如果查不到返回nums_set.end(),找得到就执行下面的指令
三、初始化
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
在这个代码中,构建了unordered_set<int> result_set存放结果,
unordered_set<int> nums_set(nums1.begin(), nums1.end());
将num1初始化num_set,也可以用insert初始化
但是,在下面的代码中,set
是在函数内部声明的局部变量。在函数开始时,set
并没有被显式初始化。然而,C++会自动为局部变量分配内存并进行默认初始化。对于unordered_set
,它的默认构造函数会创建一个空的哈希表。
class Solution {
public:
// 取数值各个位上的单数之和
int getSum(int n) {
int sum = 0;
while (n) {
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> set;
while(1) {
int sum = getSum(n);
if (sum == 1) {
return true;
}
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
if (set.find(sum) != set.end()) {
return false;
} else {
set.insert(sum);
}
n = sum;
}
}
};
四、map包括key value,
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map <int,int> map;
for(int i = 0; i < nums.size(); i++) {
// 遍历当前元素,并在map中寻找是否有匹配的key
auto iter = map.find(target - nums[i]);
if(iter != map.end()) {
return {iter->second, i};
}
// 如果没找到匹配对,就把访问过的元素和下标加入到map中
map.insert(pair<int, int>(nums[i], i));
}
return {};
}
};
iter->second就是value,在这里做key