统计字符流中一个字符串出现的次数- KMP算法

这是google onsite的一个题目, 说是一个无限的0/1字符串流, 给定一个字符串如"110010", 求到当前为止, 在字符流中出现了多少次这种字符.

一开始想到dp来做, 然后画了一下转移方程感觉不对, 然后又感觉越看越像是KMP, 仔细分析可以发现, 其思路就是求当前字符流的后缀与给定的字符串相等即可. 按照正常的思路即取与给定字符串长度相等的字符串, 比较是否相等即可, 这种方式的时间复杂为O(mn), 其中m为给定字符串, n长度为字符流长度. 利用KMP可以优化至O(n).

关于KMP, 我也不想仔细多说, 因为要说清楚很麻烦. 其主要思路是先对pattern字符串求每一位后缀与前缀的匹配长度, 然后在pattern[k]与str[i]进行匹配的时候, 如果当前一位不相等, 那么pattern字符串回退到与pattern[i-1]位后缀相等的前缀的后一位(看不懂就算了). 

代码如下:

class Solution {
public:
    int getNext(vector<int>& next, string& str)
    {
        int len = str.size(), k = 0;
        for(int i = 1; i < len; i++)
        {
            while(k>0 && str[i]!= str[k]) k = next[k-1];
            next[i] = (k+=str[i]== str[k]);
        }
        return next[len-1];
    }
    
    int match(string& str, string& pattern, vector<int>& next)
    {
        int ans = 0, len1 =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个大二数据结构与算法的计划表的详细内容: 1. 第一学期 - 第一周:学习基本数据结构,如数组、链表和栈等。 - 第二周:深入学习栈和队列,包括栈和队列的应用。 - 第三周:学习二叉树的基本概念,如二叉树的遍历和搜索等。 - 第四周:学习平衡二叉树,如AVL树和红黑树等。 - 第五周:学习哈希表和散列表,包括哈希函数的设计和冲突解决方法。 - 第六周:学习图论基础概念,如图的表示和遍历等。 - 第七周:学习最短路径算法,如Dijkstra算法和Floyd算法等。 - 第八周:学习最小生成树算法,如Prim算法和Kruskal算法等。 - 第九周:学习字符串匹配算法,如暴力法和KMP算法等。 - 第十周:学习动态规划算法,包括背包问题和最长公共子序列等。 2. 第二学期 - 第一周:学习高级数据结构,如堆、优先队列和B树等。 - 第二周:学习算法设计与分析的基本知识,如递归和分治等。 - 第三周:学习贪心算法,如活动安排问题和霍夫曼编码等。 - 第四周:学习回溯算法,如八皇后问题和0/1背包问题等。 - 第五周:学习分支限界算法,如旅行商问题和硬币找零问题等。 - 第六周:学习网络流算法,如最大流和最小割等。 - 第七周:学习NP完全性理论和近似算法,如NP完全问题和近似算法等。 - 第八周:学习并行算法和分布式算法的基础知识。 - 第九周:学习排序算法,如快速排序和归并排序等。 - 第十周:进行算法综合实践,包括问题分析、算法设计和代码实现等。 以上是一个大二数据结构与算法的计划表的详细内容,具体实施还需要根据教学计划和个人情况进行调整和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值