如何使用KMP算法查找不包含字符串B作为子字符串的字符串A的不同子字符串的数量?
我使用KMP算法解决了另一个问题但是却找不到如何用KMP解决这个问题。
提前致谢。
答案 0 :(得分:0)
我认为KMP在计数问题中很容易,你需要一个非常明确的头脑。使用KMP,您可以依次遍历A的字符,并检测A的字符,该字符结束B的出现。您可以使用它来计算包含B的A的子字符串数。
如果A的一个字符结束了B的出现,那么每个以那个开始足够远的包含B的子字符串实际上都包含B.子字符串太短而不能包含B显然不会。因此,在这种情况下,您可以计算包含B的那个字符的A结尾的子串数。
如果A的一个字符没有结束B的出现,那么每个在那里结束的子字符串开始足够远以包含先前出现的B确实包含B.所以(假设你记得上次看到B的位置) )您可以再次计算在此位置结束的包含B的子串数。
所以(在A的长度加上B的长度的时间线性,因为计算每个位置结束的子串的数量只是做一些简单的算术)你可以计算包含B的A的子串数。当然,你想要不包含B的子串数,但是A的子串总数只是A长度的二次方,所以这也很容易。