在做字符串之类的题目的时候,字符串匹配算法是经常需要的。下面给出经典的KMP算法:
void compute_prefix(string pattern, int *prefix){
int len=pattern.size();
prefix[0]=-1;
int k=-1;
for(int q=1 ; q<len ; q++){
while(k>-1 && pattern[k+1]!=pattern[q])
k=prefix[k];
if(pattern[k+1]==pattern[q])
k++;
prefix[q]=k;
}
}
int kmp_match(const string& target, const string& pattern){
int target_len=target.size();
int pattern_len=pattern.size();
int *prefix=new int[pattern_len];
int q=-1;
compute_prefix(pattern,prefix);
for(int i=0 ; i<target_len ; i++){
while(q>-1 && pattern[q+1]!=target[i])
q=prefix[q];
if(pattern[q+1]==target[i])
q++;
if(q==pattern_len-1)
return i-pattern_len+1;
}
return -1;
}
compute_prefix是计算前缀数组用的。