加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 2模式字符串匹配算法

发布时间:2020-12-14 06:08:05 所属栏目:百科 来源:网络整理
导读:我需要为最长的两个模式前缀/后缀匹配编码算法,其时间复杂度为O(n m1 m2),其中n是String的长度,m1,m2分别是pattern1和pattern2的长度. 示例:如果字符串为“OBANTAO”且Pattern1为“BANANA”且Patten2为“SIESTA”,则答案为字符串的子字符串“BANTA”,其由BA
我需要为最长的两个模式前缀/后缀匹配编码算法,其时间复杂度为O(n m1 m2),其中n是String的长度,m1,m2分别是pattern1和pattern2的长度.

示例:如果字符串为“OBANTAO”且Pattern1为“BANANA”且Patten2为“SIESTA”,则答案为字符串的子字符串“BANTA”,其由BANANA的前缀BAN和SIESTA的后缀TA组成.

谷歌的结果是:“Rabin-karp字符串搜索算法”,“Knuth-morris-pratt算法”和“Boyer-moore字符串搜索算法”.

我能够理解以上所有3种算法,但问题在于,它们都基于“单一模式前缀/后缀匹配”.我无法为两个模式前缀/后缀匹配扩展它们.

一个示例算法或搜索它的链接对我开发程序非常有帮助.

解决方法

Knuth – Morris – Pratt可以直接修改,为干草堆字符串中的每个位置产生针串的最长前缀的长度,其匹配结束于该位置.使用KMP以字符串形式计算Pat1的此信息,并以反向(字符串)反向(Pat2),然后遍历String中的每个位置,查找最大前缀/后缀长度.

String =“OBANTAO”和Pat1 =“BANANA”和Pat2 =“SIESTA”的示例:

"BANANA" = Pat1 in String
 O B A N T A O
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
| | | | | | | 0 ("")
| | | | | | 0 ("")
| | | | | 0 ("")
| | | | 3 ("BAN")
| | | 2 ("BA")
| | 1 ("B")
| 0 ("")
0 ("")

"ATSEIS" = reverse(Pat2) in reverse(String)
 O A T N A B O
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
| | | | | | | 0 ("")
| | | | | | 0 ("")
| | | | | 1 ("A")
| | | | 0 ("")
| | | 2 ("AT")
| | 1 ("A")
| 0 ("")
0 ("")

反转第二个数组并按分数求和.

0 0 1 2 3 0 0 0
+ 0 0 1 0 2 1 0 0
-----------------
  0 0 2 2 5 1 0 0
          ^
          |
         max (argument = "BAN" ++ reverse("AT"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读