数据结构之栈,队列,串介绍

电子说

1.2w人已加入

描述

栈和队列不再过多描述,了解入栈出栈规则,入队出队规则,栈的递归应用即可,面试肯定不会考这种概念,太简单。

LeetCode36栈的应用

C++语言

C++语言

C++语言

C++语言

比如说有相当多的四则运算,前缀,中缀,后缀的题目都与栈有关。

主要想讲一下串这种数据结构。串百分之九十九指的都是字符串,对于一个字符串S="Googlegoodgoor",来讲想要找到一个为“goor”的子串,最常用的方法暴力搜索,一位一位的对照,直至找到相应的子串,当然这种算法太过于复杂,对于一个复杂的字符串,除非你的正则表达式,用的非常的好,能够快速定位到需要的东西,否则你需要设计相当多的代码,来实现这个功能。下面介绍一种算法,KMP模式匹配算法,能够大大减少重复遍历的情况,这个算法很重要,2020年在面试腾讯C++岗位,让我手写过KMP算法。

讲一下大致流程,原理可以自己分析。

设模式串为S="abcdaabcab",子串为T="abcab",传统暴力解决方法S[0],T[0]比较,在比较S[1],T[1],当S[3],T[3]不相等的时候,S退回到S[0],T退回到T[0],当我们匹配到S[3],T[3]不等的时候S有必要退回S[2]重新比较么,显然第一次比较的所有动作全部白费,KMP很好的解决了这种重复遍历的情况,用一个Next数组来保存这些有用的信息。

Next数组,最长前缀默认Next[0]=-1,什么是最长前缀,对于子串abcab,有相等前缀后缀子串ab。

C++语言

匹配方法:当我们第一次匹配的时候,S位置在S[3],T位置在T[3]不相等,我们借助next数组next[3]为0所以子串要退回到T[0]位置,与S[3]相比依然不相等,这时候就需要S移动到S[4]的位置,S[4]=T[0],但S[5]不等于T[1],即子串退回到next[1]的T[0]位置,即从后面开始可以匹配到子串。

LeetCode第28题

C++语言

C++语言

C++语言

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分