【CH1809】匹配统计(KMP)】的更多相关文章

1809 匹配统计 0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度. 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x. 例如:A=aabcde,B=ab,则A有aabcde.abcde.bcde.cde.de.e这6个后缀子串,它们…
题意 描述 阿轩在纸上写了两个字符串,分别记为A和B.利用在数据结构与算法课上学到的知识,他很容易地求出了"字符串A从任意位置开始的后缀子串"与"字符串B"匹配的长度. 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足"字符串A从该位置开始的后缀子串"与B匹配的长度恰好为x. 例如:A=aabcde,B=ab,则A有aabcde.abcde.bcde.cde.de.e这6个后缀子串…
看了好久才懂,我好菜啊-- 题意:给两个字符串 \(a\) 与 \(b\),对于 \(q\) 次询问,每次询问给出一个 \(x\),求存在多少个位置使得 \(a\) 从该位置开始的后缀子串与 \(b\) 匹配的长度恰好为 \(x\). 这题可以 Hash+二分 \(O(n\log n)\) 过,还有一个高端做法是扩展 KMP(然而并不会 正解的话,还是 KMP.但此题对 KMP 的理解还是要求很高啊. 对 \(b\) 求一遍 \(nxt\),再求 \(a\) 的 \(f\).那么根据定义,\(f…
字符串匹配是字符串的一种基本操作:给定一个长度为 M 的文本和一个长度为 N 的模式串,在文本中找到一个和该模式相符的子字符串,并返回该字字符串在文本中的位置. KMP 算法,全称是 Knuth-Morris-Pratt 算法,以三个发明者命名,开头的那个K就是著名科学家 Donald Knuth .KMP 算法的关键是求 next 数组.next 数组的长度为模式串的长度.next 数组中每个值代表模式串中当前字符前面的字符串中,有多大长度的相同前缀后缀. Boyer-Moore 算法在实际应…
题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长度为n KMP算法的本质是根据子串的next值求解的,所以首先讲解next值得求法: 字串的Next值的求解方法: next[i]的含义是:以i-1位置结尾的字符串与以0位置开始的字符串的最长匹配 1. 创建一个与子串大小相同长度的int型数组next 2. next值中的next[0] = -1,…
题目链接 摘自https://www.cnblogs.com/wyboooo/p/9829517.html 用KMP先求出以a[i]为结尾的前缀与b匹配的最长长度. 比如 f[i] = j,就表示a[1~i]的后缀最多可以和b[1~j]匹配.但求出这个并不意味着以a[i]为开头的后缀可以和b恰好匹配j位(因为也许后面还可以匹配),但是可以肯定的是他至少可以匹配j位.我们很难求出恰好可以匹配x位的位置有多少,但是我们可以存至少可以匹配x位的位置的数目,结果用cnt[x] - cnt[x +1]就可…
引言 字符串的模式匹配是一种经常使用的操作. 模式匹配(pattern matching),简单讲就是在文本(text,或者说母串str)中寻找一给定的模式(pattern).通常文本都非常大.而模式则比較短小.典型的样例如文本编辑和DNA分析. 在进行文本编辑时,文本一般是一段话或一篇文章,而模式则经常是一个单词.若是对某个指定单词进行替换操作,则要在整篇文章中进行匹配,效率要求肯定是非常高的. 模式匹配的朴素算法 最简单也最easy想到的是朴素匹配.何为朴素匹配,简单讲就是把模式串跟母串从左…
前言 现在有两个字符串:\(s1\)和\(s2\),现在要你输出\(s2\)在\(s1\)当中每一次出现的位置,你会怎么做? 暴力匹配算法 基本思路 用两个指针分别指向当前匹配到的位置,并对当前状态进行分类讨论:若相同则继续往下匹配,否则回溯 大致思路 用\(i\)来存储\(s1\)当前匹配到的位置,用\(j\)来存储\(s2\)当前匹配到的位置,则可得初始状态下\(i=j=0\). 对于当前状态,有两种可能性: ①:\(s1[i]==s2[j]\).则\(i++,j++\) ②:\(s1[i]…
阿轩在纸上写了两个字符串,分别记为A和B. 利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度. 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题: 在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x. 例如:A=aabcde,B=ab,则A有aabcde.abcde.bcde.cde.de.e这6个后缀子串,它们与B=ab的匹配长度分别是1.2.0.0.0.0.…
public static int getIndexOf(String str1, String str2) { if (str1 == null || str2 == null || str1.length() < str2.length()) { return -1; } char[] mm = str1.toCharArray(); char[] nn = str2.toCharArray(); int[] next = getNextArray(str2); int m = 0; int…