模式匹配是数据结构中字符串的一种基本运算,给定一个子串,即在某个字符串中找出与该子串相同的所有子串的过程。
例如,在主串S= "abcdacde" 中找出子串 T = "cd", 找到子串后返回在主串中子串所在的位置索引 [2, 5]。
一、朴素的模式匹配算法(BF)
算法思想:从目标串的的第一个字符起与模式串的第一个字符比较,若相等,则继续对字符进行后续的比较,否则目标串从第二个字符起与模式串的第一个字符重新比较,直至模式串中的每个字符依次和目标串中的一个连续的字符序列相等为止,此时称为匹配成功,否则匹配失败。
若模式子串的长度是m,目标穿的长度是n,这时最坏的情况是每遍比较都在最后出现不等,即没变最多比较m次,最多比较n-m+1遍,总的比较次数最多为m(n-m+1),因此朴素的模式匹配算法的时间复杂度为O(mn)。朴素的模式匹配算法中存在回溯,这影响到匹配算法的效率,因而朴素的模式匹配算法在实际应用中很少采用。在实际应用主要采用无回溯的匹配算法,KMP算法和BM算法均为无回溯的匹配算法。
JavaScript实现 BF 算法:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>字符串</title>
</head>
<body>
<script>
(function(){
//带回溯的朴素模式匹配算法BF
var BF = function(str,s){
var result = [],index;
var m = 0,n = 0;//m:主串的索引,n:子串的索引
for(let m=0