代码随想录 一星期总结 3.31-4.7

代码随想录 一星期总结 3.31-4.7

哈希专题

首先 三种结构体
set/map unordered_set/map multiset/map
然后 在用了在三数之和以及四数之和那里使用了 multimap 因为要查重
但是还是超时了 用双指针不会超时 multimap的查找就是 equal_range(key)
这里是返回一个 pair pair.first 是首个迭代器 pair.second 是尾部迭代器

字符串哈希在acwing 那里也看了 是一个非常厉害的方法
尤其是处理好了 每个字符串之后 找每个字串的哈希值是1
(但是 用unordered_map也是一样的 哈哈哈哈)

字符串

这里主要是很多题目的进阶都是不使用额外的空间 比如原地修改string
如果字符串与结果串又不一样 那就经常出现 resize函数
str.resize(长度) 然后默认填充\0 但是她的s.size()是已经扩充之后的数

KMP

KMP是一个经典的字符串匹配算法
我们先从暴力入手
s=“dasdsadascdas” p=“sadasc”
肯定是

for(int i=0,j=i+p.size()-1;i<n&& j<n;i++,j++)
{
	if(s.substr(i,p.size()==p) return true;
}
return false;

暴力复杂度太高了 O(nm)
其实哈希也是O(n+m) 但是空间消耗 o(n)
KMP O(m) 且一般 m<<n
KMP 算法是说 如果 两个字符串匹配不成功 那么能不能利用一些信息呢之前匹配过的信息答案肯定是有的 最长相等前后缀就是这个能利用得信息
next[i]=表示 s[i]得最长相等前后缀得那个前缀得下标 也就是长度为 next[i]+1;

然后next数组 通过暴力求复杂度也很高 可以通过递归求
比如

if s[i] == p[j+1] 那么next[j+1]=next[j]+1;  j代表已经匹配得下标 初始化为-1
if s[i] != p[j+1] 那么找到一个j使得 s[i] == p[j+1] 且 p[0..j]=s[i-j+1,i-1] 因为你既要满足目前这个元素得匹配 又要满足 你是s[0,i-1]的后缀能被p[0.j]前缀匹配 这样

int j=-1;
next[0]=-1;
for(int i=1;i<p.size();i++)
{
while(j !=-1 && p[i] !=p[j+1])
{ j=next[j]; } #这里j 还是指向上一个位置 因为还没有被匹配 
if(p[i]==p[j+1]) j++; #如果匹配到了 说明说明前缀数组能延伸了 

next[i]=j; #
}

后面的利用next数组求匹配还没看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值