字符串匹配-Sunday 算法

205 阅读1分钟

算法核心: 尽可能多的前进更多步

问题定义:在字符串"substring searching algorithm"中查找模式串"search"。

算法讲解:
Sunday算法从前往后匹配,每次比较对应位置字符串,如果匹配失败向前移动尽可能多的步数。首先查看母串中下一个未参与比较的字符M

  1. 如果M不在模式串中,则直接前进: 模式串长度+1
  2. 如果M在模式串中,则将模式串中最左边与字符M对齐,需要移动一个偏移距离offset。

屏幕快照 2022-02-18 下午3.44.45.png

如上面例子:

  1. 先比较对应位置“search”与“substr”,不相同。则看下一个未参与比较的字符i
  2. 字符i不在模式串"search"中,则直接前进到字符i下一个字符,就是前进 模式串长度+1步。
  3. 再比较对应位置“search”与“ng sear”,不相同。则看下一个未参与比较的字符c
  4. 字符c在模式串"search"中,前进将两个字符串在字符c出对齐,前进2步。
  5. 比较对应位置“search”与“search”,成功!

算法实现:

这里可以先根据模式串算好移动距离,比如对“search”,前进步数:
offset={'h': 1, 'c': 2, 'r': 3, 'a': 4, 'e': 5, 's': 6}

代码:LC28