《挑战程序设计竞赛》 p380
问题:要求字符串T在字符串S中出现的位置。
分析:kmp当然可以。
这里介绍一种利用后缀数组的做法,假设已经计算出了字符串S的后缀数组,可以通过二分搜索来找。
复杂度为O(|T||og|S|)
bool contain(string S, int* sa, string T) {
int a = 0;
int b = S.length();
while (b - a > 1) {
int c = (a + b) / 2;
//比较S从位置sa[c]开始长度为|T|的子串与字符串T进行比较
if (S.compare(sa[c], T.length(), T) < 0 ) a = c;
else b = c
}
return S.compare(sa[c], T.length(), T) == 0;
}