字符串匹配

字符串匹配
参考资料:算法导论

字符串匹配问题定义

假设文本是一个长度为 n 的数组 T[ 1.. n ],模式是一个长度为 m <= n 的数组 P[ 1 .. m] 。进一步假设 P 和 T 都是属于有限字母表中的字符。
如果 0 <= s <= n-m ,并且 T[ s+ 1 .. s+m] = P [ 1.. m ] ( 即对 1 <= j <= m ,有 T[s + j] = P[ j ] ),则说该模式P 在文本 T 中出现且位移为 s。
                      

字符串匹配算法比较


算法预处理时间匹配时间
朴素算法    0   O( (n-m+1) m )
Rabin-Karp    O ( m)   O ( (n-m +1) m)
有限自由机算法   O(m|E|) (|E|:字符集的个数)   O ( n )
Knuth-Morris-Pratt ( KMP )   O ( m )   O ( n)

注:
Rabin-Karp在最坏情况下的运行时间为 O( (n-m+1) m ) , 虽然这一时间并不比朴素算法好,但在平均情况和实际情况下,该算法的效果要好得多。这种算法可以很好的推广到解决其他的模式匹配问题中去;
KMP算法设计很巧妙,预处理的时间减少到 O ( m ) 。

记号、术语、引理

1 ∑* 表示用字母表∑中的字符形成的所有有限长度的字符串的集合。

2 字符串 x 的长度用 | x | 表示。两个字符串 x 和 y 的连接表示为 xy ,其长度为 | x | + | y | ,由 x 的字符接 y 的字符组成。

3 如果对于某个字符串 y ∑* ,有 x = wy,就说字符串 w 是字符串 x 的前缀,表示为 w 【 x ,| w | <= | x |。类似的,如果对某一个字符串 y ∑*,有 x = yw,就说字符串 w 是字符串 x 的后缀,表示为 w 】x 。

重叠后缀引理

假设 x ,y 和 z 是满足 x 】z 和 y 】z 的三个字符串。如果 | x | <= | y |,则x 】y ;如果 | x | >= | y |,则 y 】 x;如果 | x | = | y |  ,则 x = y。



 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,有多种方法可以进行字符串匹配,具体的选择取决于你的需求和场景。以下是几种常见的字符串匹配方法: 1. 使用`==`运算符进行匹配:你可以使用`==`运算符来判断两个字符串是否相等。例如: ```python str1 = "hello" str2 = "world" if str1 == str2: print("字符串匹配成功") else: print("字符串匹配失败") ``` 2. 使用`in`关键字进行匹配:你可以使用`in`关键字来判断一个字符串是否包含另一个字符串。例如: ```python str1 = "hello world" str2 = "world" if str2 in str1: print("字符串匹配成功") else: print("字符串匹配失败") ``` 3. 使用`find()`方法进行匹配:`find()`方法可以用来查找一个子字符串在原字符串中的位置。如果找到了子字符串,它会返回子字符串的起始位置;如果没有找到,它会返回-1。例如: ```python str1 = "hello world" str2 = "world" index = str1.find(str2) if index != -1: print("字符串匹配成功,起始位置为", index) else: print("字符串匹配失败") ``` 4. 使用正则表达式进行匹配:正则表达式是一种强大的字符串匹配工具,可以用来匹配更加复杂的字符串模式。Python提供了`re`模块来支持正则表达式操作。例如,你可以使用`re.search()`函数来查找一个字符串中是否存在匹配某个模式的子字符串: ```python import re str1 = "hello world" pattern = r"world" match = re.search(pattern, str1) if match: print("字符串匹配成功") else: print("字符串匹配失败") ``` 这些是一些常见的字符串匹配方法,你可以根据具体的需求选择合适的方法来进行字符串匹配

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值