前言 字符串的匹配算法也是很经典的一个算法,在面试的时候常常会遇到,而BF算法是字符串模式匹配中的一个简单的算法 1,什么是BF算法 BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,思想简单,代码结构也简单 BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. 2,代码实现 分析: 要完成对于所有字符的匹配工作,可以遍…
1.暴力比较 BF算法 2.比较字串hash值 RK算法 //字符串匹配 public class StringCmp { //约定:A主串长 n ,B模式串 长m.要求:在A串中找到B串匹配的下标 // //1.BF burst force 暴力比较,逐个字符比较 //2.RK 以hash算法为主,比较字符串 //1.BF 时间复杂度 O(n*m) //在A中进行 A[0,n-m] 范围内的 n-m+1 次的 m个字符比较 //平时最容易理解的方式 public static int BF(c…
BF算法是字符匹配的一种算法,也称暴力匹配算法 算法思想: 从主串s1的pos位置出发,与子串s2第一位进行匹配 若相等,接着匹配后一位字符 若不相等,则返回到s1前一次匹配位置的后一位,接着与s2的起始位进行匹配 直到与s2全部匹配成功,则返回在s1中开始完全匹配的下标 简单说这个算法的思想就是匹配失败,就重新从上一次匹配位置的下一位开始匹配 难理解之处: ①i = i - j + 2,这一步是若匹配失败,从上一次匹配位置的下一位开始 i - j是去掉前面匹配过的次数,+ 2是到达下一个匹配位…
举例来说,有一个字符串"DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA",我想知道,里面是否包含另一个字符串"JFJI",有的话就返回在原字符串中的下标 先看看Java编码的实现 public static void main(String[] args) { String source = "DSFFKFJD KFJLKFDLJFJ IWWJKJFJIA"; String des = "JFJI"; for…
功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 var i,j,k,l,m,n:longint; a:..] of longint; s1,s2:ansistring; begin readln(s1); a[]:=; to length(s…
1 问题描述 给定一个n个字符组成的串(称为文本),一个m(m <= n)的串(称为模式),从文本中寻找匹配模式的子串. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapterThree; public class BruteForceStringMatch { //根据文本串N,和模式串M,返回第一个匹配模式串的子串在N中的位置 public static int getStringMatch(int[] N , int[] M){ int n = N.lengt…
和KMP相似,用于字符串的匹配,貌似平均复杂度比KMP快,也比KMP更好理解. 大概意思是: 如果串b被串a包含,那么串a此时与串b匹配的部分一定一样 所以如果从开头开始匹配到不同处时,在a串找中此时a串中对应的b串末尾下一位最靠右出现的位置,记作m 如果找不到,直接跳过这一段(显然无法在这一段里找到答案) 如果找到,就让b串中这个位置与m对齐 大概是这么一个意思: Step1:比较至第二位时发现失配,比较两个染色位置的字符,发现相同 Step2:将T字符从左往右数的第一个与S[4]相同的字符移…
给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i = 0, ..., N-1,都有: 如果 S[i] == "I",那么 A[i] < A[i+1]如果 S[i] == "D",那么 A[i] > A[i+1] 示例 1: 输出:"IDID"输出:[0,4,1,3,2]示例 2: 输出:…
原题链接 题目: 给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整数N,表示字符串P的长度. 第二行输入字符串P. 第三行输入整数M,表示字符串S的长度. 第四行输入字符串S. 输出格式 共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间用空格隔开. 数据范围 1 ≤ N ≤ 10^5 1 ≤ M ≤ 10^6 输入样例: 3 ab…
求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输入为一个字符串s,Z算法可以求出这个字符串每一个后缀与自身的最长公共前缀LCP,Z算法可以求出一个数组z,z[i]表示suffix(i)与字符串本身的最长公共前缀. 接下来,介绍Z算法的具体内容. 记字符串s的长度为n. Z算法需要维护一对值,记为left和right,简记为L和R.L和R满足s[L…