对于字符串的匹配,也就是查找是否在主串中包含一个特定的子串,我们能想到的最简单直观的算法就是BF算法。
在BF(Brute Force)算法中,我们的处理方式是:
1.先在主串中找到一个字符跟子串的第一个字符相同
2.如果是在主串的位置i上找到了这个字符,然后主串和子串依次向后移动,对子串剩下的字符串进行匹配。如果匹配成功则返回位置i。
3.否则从位置i的下一个位置开始,继续重复步骤1,找那个跟子串第一个字符匹配的那个位置,然后再进行匹配。
4.如果一直到主串的末尾都没匹配成功说明匹配失败。
例如:
主串:
a b c d f e g c d f e t
1 2 3 4 5 6 7 8 9 10 11 12
子串:
c d f e t
1 2 3 4 5
在这个例子中,我们可以看到,最终匹配成功的位置应该是8
首先我们在主串位置3成功匹配首字符,接下来到位置7的时候匹配失败了。因为主串是g,子串是t。不匹配。
按照BF的思想,我们应该从位置3的下一个位置也就是d继续匹配首字符。
但是重点来了,你是否发现一个问题,这里面我们从3的下一个位置开始匹配首字符其实是多余的。为什么呢,因为从位置3的c到位置7的g中间没有另外一个c能够让我们成功匹配首字符。主要原因是子串中没有跟首字符重复的字符出现过,注意一定是首字符。那么原因就显然易见了,因为子串从c到e一直是和主串匹配的,而子串中c到e又没重复出现过c,所以在主串中,c到e也一定不会匹配到一个c,所以从d开始匹配是多余的。实际上我们从失配的那个字符开始重新匹配就行了,也就是
在BF(Brute Force)算法中,我们的处理方式是:
1.先在主串中找到一个字符跟子串的第一个字符相同
2.如果是在主串的位置i上找到了这个字符,然后主串和子串依次向后移动,对子串剩下的字符串进行匹配。如果匹配成功则返回位置i。
3.否则从位置i的下一个位置开始,继续重复步骤1,找那个跟子串第一个字符匹配的那个位置,然后再进行匹配。
4.如果一直到主串的末尾都没匹配成功说明匹配失败。
例如:
主串:
a b c d f e g c d f e t
1 2 3 4 5 6 7 8 9 10 11 12
子串:
c d f e t
1 2 3 4 5
在这个例子中,我们可以看到,最终匹配成功的位置应该是8
首先我们在主串位置3成功匹配首字符,接下来到位置7的时候匹配失败了。因为主串是g,子串是t。不匹配。
按照BF的思想,我们应该从位置3的下一个位置也就是d继续匹配首字符。
但是重点来了,你是否发现一个问题,这里面我们从3的下一个位置开始匹配首字符其实是多余的。为什么呢,因为从位置3的c到位置7的g中间没有另外一个c能够让我们成功匹配首字符。主要原因是子串中没有跟首字符重复的字符出现过,注意一定是首字符。那么原因就显然易见了,因为子串从c到e一直是和主串匹配的,而子串中c到e又没重复出现过c,所以在主串中,c到e也一定不会匹配到一个c,所以从d开始匹配是多余的。实际上我们从失配的那个字符开始重新匹配就行了,也就是