跳到正文

4.2.1 朴素模式匹配算法

40 分钟

4.2.1 朴素模式匹配:每次失败只右移一个起点

给主串 长度 、模式串 长度 。朴素算法枚举起始下标 ,从模式首字符开始逐个比较;完全相等便返回 ,失败就让起点右移 1。

int naive(const char*t,int n,const char*p,int m){
 if(m==0)return 0;
 for(int s=0;s+m<=n;s++){
  int j=0;while(j<m&&t[s+j]==p[j])j++;
  if(j==m)return s;
 }
 return -1;
}

手工推演 T='ababaca'P='abaca':起点 0 比到第 4 个字符时,主串 b 与模式 c 不同;起点移到 1,首字符即失败;起点 2 比较 5 个字符全部成功,返回下标 2、位序 3。

最坏情况下有 个起点,每个比较近 次,时间 ,常简写 。例如主串大量 a、模式为若干 a 后接 b,每次都在接近末尾失败。额外空间

若要统计所有允许重叠的出现,匹配成功后也只把起点加 1;若直接跳过 个字符,会漏掉 'aaaa''aa' 的重叠出现。空模式如何处理必须由接口约定,常见约定是在下标 0 匹配成功。

错解反馈:失败后把主串扫描指针继续前进而不恢复下一个起点,会漏候选位置;循环写成 s<n-m 会漏最后一个合法起点;返回比较结束位置而非起始位置会偏移。

迁移题:T='aaaaab'P='aaab' 从哪些起点尝试,在哪里成功?答案尝试下标 0、1、2,在 2 成功。独立验收:能画对齐表,统计每轮比较次数,并解释最坏复杂度来源。

小纸条

推演:T='aaaaab',P='aaab',朴素算法尝试哪些下标并在哪里成功?

登录 后可看答案

Practice

本课练习

0

先独立作答再提交;编程题会在隔离沙箱中真实编译、运行并对拍。

本课练习正在补齐,暂不应标记为完成。