今天完成了5道题目分别是(力扣LeetCode):2、20、21、26、27
旧东西
- 双指针(索引),这种解题思路在数组中寻找元素比较常见,通过一个变化较快和一个变化较慢的索引来完成对整个数组的检索,比较方便,也比较直接
新东西
- BF算法
非常粗暴直接的字符串匹配算法,目标字符串的首字符与被比较字符串的各个位置进行比较,当比较找到相同的字符时,则目标字符的下一位与被比较字符串的下一位进行比较,如果相同则继续直到最后,如果找到即返回当前被比较字符串所处的位置,如果不相同,则又重首字符进行匹配,直到匹配到或者遍历完整个被比较字符串。 - BM算法
后缀匹配,定义了好后缀和坏字符两个字符串,通过利用好后缀和坏字符较大的那一个数值进行目标字符串相对于被比较字符串的移动,两种移动也会分情况。
如果是利用坏字符进行移动,则需要根据坏字符是否出现在目标字符串中来进行移动,如果没有出现,则可以把目标字符串移动到坏字符的下一个字符,继续进行比较;如果出现,则吧目标字符串第一次出现坏字符与被比较字符串的坏字符进行对齐。
如果是利用好后缀来进行移动,则会分为三种情况,一:目标字符串中有子串匹配上好后缀,则让最左子串位置与好后缀进行位置上的对齐;二:目标串中没有子串匹配上好后缀,则在目标串中寻找与好后缀的最长前缀,并让目标字符串的最长前缀起始位置与好后缀相匹配的起始位置进行对齐;三:完全没有匹配上的,就直接将目标串移动一个目标串的长度。
详情参见:https://blog.youkuaiyun.com/Hym_eric/article/details/78681929 - KMP算法
此算法常用于在一个文本串S内查找一个模式串P的出现位置,它的思想大致是,假如现在文本串S匹配到i位置,模式串P匹配到j位置,如果j=-1,或者当前字符匹配成功(即S[i]==P[j]),都令i++,j++,继续匹配洗一个字符;如果j!=-1,且当前字符匹配失败(即S[i]!=P[j]),则令i不变,j=next[j]。此举意味着匹配失败时,模式串P相对于文本串S向右移动了j-next[j]位,换言之,当匹配失败时,模式串向右移动的位数为:j-next[j],且大于等于1。
详情参见:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html - Sunday算法
相较KMP和BM算法而言,简单了许多。
匹配原理:从前往后匹配:如果遇到不匹配情况判断母串dest参与匹配的最后一位的下一位字符,如果该字符出现在模板串pattern中,选择最有出现的位置进行对齐;否则直接跳过该匹配区域
详情参见:https://blog.youkuaiyun.com/wonder233/article/details/79035403
总结
- 今天了解到了4种对于字符串匹配的算法,虽然每种算法都是在前一种算法上进行改进的,但是代表着不同的思想值得深入学习,现在只是了解到了有这么几种算法,以及思想,它们的实现将在后面补充上来
- 今天刷了几道算法题,发现现在对数据结构有点陌生了,准备接下来花一天时间好好的总结一下。