当前位置:首页 > 实用技巧 >

如何匹配某字符串(字符串匹配怎么输入)

来源:原点资讯(www.yd166.com)时间:2024-02-03 04:14:10作者:YD166手机阅读>>


代码实现如下:

public static int[] getPrefix4(String str){ int[] prefix = new int[str.length()]; int j = 0; int i = 1; while(i < str.length()){ if (str.charAt(j) == str.charAt(i)){ // 更新j,同时j 也正是已匹配的最大长度 j ; prefix[i] = j; i ; }else if(j == 0){ // 当str.charAt(j) != str.charAt(i) && j == 0时,后移i即可 i ; }else{ // 找到已匹配的部分,继续匹配即可 j = prefix[j-1]; } } return prefix; } 2.4 求解next

很多kmp算法的讲解都提到了next数组,那么实际上next数组求解和上面的prefix求解本质是一样的,next[i]实际上就是以i-1为结尾的最长的相同真前后缀的长度。

定义next[j]为当s[i] != p[j]时,需要跳转匹配的模式串的索引,特别的当next[0] = -1

public static int[] getNext(String str){ int[] next = new int[str.length() 1]; int i = 1; int j = 0; // next[0] = -1 指代匹配失败,更新文本串索引 1 next[0] = -1; while(i < str.length()){ if (j == -1 || str.charAt(i) == str.charAt(j)){ i ; j ; next[i] = j; }else{ j = next[j]; } } return next; } 2.5 完整代码

public static int search(String s, String p){ int[] next = getNext(p); int i = 0, j = 0; while(i < s.length() && j < p.length()){ if (j == -1 || s.charAt(i) == p.charAt(j)){ i ; j ; }else{ j = next[j]; } if (j == p.length()){ return i - j; } } return -1; } 2.6 优化next

以上面的next数组为例,当i=5,匹配失败时,应该跳转i=1进行比较,但是我们知道s[5]=s[1]="B",这样匹配下去也是必定会失败的,基于这一点,还可以简单优化下next数组的求解过程。

public static int[] getNext1(String str){ int[] next = new int[str.length() 1]; int i = 1; int j = 0; next[0] = -1; while(i < str.length()){ if (j == -1 || str.charAt(i) == str.charAt(j)){ i ; j ; if (i < str.length() && str.charAt(i) != str.charAt(j)){ next[i] = j; }else{ // 如果相同,根据next[j]跳转即可 next[i] = next[j]; } }else{ j = next[j]; } } return next; } 三、其他算法

这一部分,介绍几种其他字符串搜索的算法

3.1 BM

1977 年,德克萨斯大学的 Robert S.Boyer 教授和 J StrotherMoore 教授发明了一种新的字符串匹配算法:Boyer-Moore算法,简称BM 算法。BM算法的基本思想是通过后缀匹配获得比前缀匹配更多的信息来实现更快的字符跳转。

通常我们都是从左至右去匹配文本串和模式串的,下面我们从右至左尝试匹配并观察下。文本串中的字符“S”,在模式串中未出现,那么我们是不是可以跳过多余的匹配,不用去考虑模式串从文本串中第1个、第2个、第m个字符进行匹配了。可以直接将模式串向后滑动m个字符进行匹配。

如何匹配某字符串,字符串匹配怎么输入(17)


继续观察下面匹配失败的情况,我们可以发现,模式串后三个字符“E”、“L”、“P”一定无法和文本串中的字符“M”进行匹配。换句话说,直到移动到模式串中最右边的“M”(如果存在的话)之前,都是无法匹配成功的。基于这个观察,我们可以直接向后移动模式串,使最右边出现的“M”和文本串中的“M”对齐,再去继续匹配。

如何匹配某字符串,字符串匹配怎么输入(18)


总结:1.当出现失配字符时(文本串的字符),如果模式串不存在该字符,则将模式串右移至失配字符的右边。

如何匹配某字符串,字符串匹配怎么输入(19)


2.如果模式串中存在该字符,将模式串中该字符在最右边的位置,和文本串的失配字符对齐。

如何匹配某字符串,字符串匹配怎么输入(20)

栏目热文

问号可以跟几个字符匹配(匹配字符正确使用方法)

问号可以跟几个字符匹配(匹配字符正确使用方法)

今天我们来聊聊Excel中模糊匹配的问题,所谓的模糊匹配就是通过一两个关键字或者关键词来找出它对应的结果。但是Excel...

2024-02-03 03:51:31查看全文 >>

匹配一串字符的命令(字符串匹配怎么输入)

匹配一串字符的命令(字符串匹配怎么输入)

大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频。今天我们学习dos中的...

2024-02-03 03:56:30查看全文 >>

字符数据快速匹配方法(字符串模糊匹配)

字符数据快速匹配方法(字符串模糊匹配)

Excel对大小写不怎么敏感,当然对于我们总是使用汉字来查询,也经常会忽略这个问题,毕竟大小写数要是针对英文字母,在实际...

2024-02-03 04:10:35查看全文 >>

多个字符匹配方法大全(字符串匹配怎么输入)

多个字符匹配方法大全(字符串匹配怎么输入)

1. 匹配多个字符代码功能*匹配前一个字符出现0次或者无限次,即可有可无 匹配前一个字符出现1次或者无限次,即至少有1次...

2024-02-03 04:09:57查看全文 >>

超过15个字符怎么匹配(怎么把含有特定字符的找出来)

超过15个字符怎么匹配(怎么把含有特定字符的找出来)

20230528星期日:使用 countif 统计,如果单元格数据超过 15 位,那么需要在公式的后面加上 &“*”,...

2024-02-03 03:49:01查看全文 >>

又是一年清明节网络扫墓词美篇(清明节扫墓文案朋友圈)

又是一年清明节网络扫墓词美篇(清明节扫墓文案朋友圈)

网民朋友们:时值一年春草绿,又是一年清明时。在这慎终追远、缅怀先人、寄托哀思的时节,为传承孝道家风,倡导绿色祭祀、文明祭...

2024-02-03 03:59:24查看全文 >>

清明民间扫墓倡议书(清明扫墓文明祭祀倡议书)

清明民间扫墓倡议书(清明扫墓文明祭祀倡议书)

广大市民朋友们:序春草绿,又到清明。清明节是我们缅怀故人、追思先烈、寄托哀思的传统节日,为弘扬中华民族传统美德,倡导文明...

2024-02-03 04:01:07查看全文 >>

清明节在网上扫墓感受(清明网上扫墓寄语)

清明节在网上扫墓感受(清明网上扫墓寄语)

在网上缅怀,就不得不提遥望天堂云缅怀了。因时而变,不少人开始关心环保和文明祭祀。清明节,作为一个实实在在重要的传统意义上...

2024-02-03 04:04:14查看全文 >>

清明时节扫墓温馨提示(清明扫墓10件事一定要知道)

清明时节扫墓温馨提示(清明扫墓10件事一定要知道)

清明节即将来临,回乡祭扫、焚香烧纸等活动频繁,发生火灾的因素增多。据广州消防统计,全市近五年清明节期间共发生火灾322起...

2024-02-03 04:28:22查看全文 >>

清明节扫墓随感(清明节扫墓的过程和感受)

清明节扫墓随感(清明节扫墓的过程和感受)

今年清明节4月2号从武汉出发,前一天我买了我妈妈喜欢吃的糕点,小麻花,各种水果,因为很有几年没回去,不知家里有没有?先准...

2024-02-03 04:30:57查看全文 >>

文档排行