算法核心: 尽可能多的前进更多步
问题定义:在字符串"substring searching algorithm"中查找模式串"search"。
算法讲解:
Sunday算法从前往后匹配,每次比较对应位置字符串,如果匹配失败向前移动尽可能多的步数。首先查看母串中下一个未参与比较的字符M:
- 如果M不在模式串中,则直接前进: 模式串长度+1。
- 如果M在模式串中,则将模式串中最左边与字符M对齐,需要移动一个偏移距离offset。
如上面例子:
- 先比较对应位置“search”与“substr”,不相同。则看下一个未参与比较的字符i。
- 字符i不在模式串"search"中,则直接前进到字符i下一个字符,就是前进 模式串长度+1步。
- 再比较对应位置“search”与“ng sear”,不相同。则看下一个未参与比较的字符c。
- 字符c在模式串"search"中,前进将两个字符串在字符c出对齐,前进2步。
- 比较对应位置“search”与“search”,成功!
算法实现:
这里可以先根据模式串算好移动距离,比如对“search”,前进步数:
offset={'h': 1, 'c': 2, 'r': 3, 'a': 4, 'e': 5, 's': 6}
代码:LC28