boyer-moore 算法
模式串的主串的匹配过程 看作模式串在主串不停地向后滑动
当遇到不匹配的字符时 bf rk都是模式串往后移动一位
那么有没有更高效的 往后移动多位呢
如果往后滑动的时候 有重合 无法匹配的时候 可以多滑动几位
1 |
|
曾因酒醉鞭名马 生怕情多累美人
boyer-moore 算法
模式串的主串的匹配过程 看作模式串在主串不停地向后滑动
当遇到不匹配的字符时 bf rk都是模式串往后移动一位
那么有没有更高效的 往后移动多位呢
如果往后滑动的时候 有重合 无法匹配的时候 可以多滑动几位
1 |
|
主串 子串(模式串)
BF算法 在主串中检查起始位置分别是0、1、2…n-m且长度为m的n-m+1个子串
时间复杂度是n*m
但是在实际开发的过程中 是比较常用的
因为
大部分情况下 模式串和主串的长度都不会太长
而且每次模式串与主串中的子串匹配的时候 当中途遇到不能匹配的字符时 就停止了 不需要把字符串都比对一下 大部分情况下 够用
朴素字符串匹配算法思想简单 代码实现也非常简单 简单意味着不容易出错
在满足性能要求的前提下 简单是首选
RK
在朴素字符串匹配的基础上 引入哈希
对每个子串分别求哈希值 然后拿子串的哈希值与模式串的哈希值比较
理想情况下的时间复杂度是n
1 |
|
输出如下:
1 | --- time consume --- |
1 |
|
1 |
|
输出单链表倒数第k个节点
1 | // 双指针法 |
链表中存在环的问题
1 | bool isExistLoop(ListNode* pHead) { |
使用链表实现大数相加
1 |
|
有序链表合并
1 | ListNode* mergeTwoOrderedLists(ListNode* pHead1, ListNode* pHead2){ |
删除链表中节点 要求时间复杂度为1
1 | void deleteNode(ListNode **pHead, ListNode* pDelNode) { |
从尾到头打印链表
1 | class Solution { |
反转链表
1 |
|
有效的括号
1 | class Solution { |
两个栈 实现队列
1 | Stack<Integer> in = new Stack<Integer>(); |
栈的压入 弹出序列
1 | public boolean IsPopOrder(int[] pushSequence, int[] popSequence) { |
包含min 函数的栈
1 | private Stack<Integer> dataStack = new Stack<>(); |
计算器
1 |
其他题
1 |