1.普通的字符串匹配算法可以从开始处逐个匹配字符,遇到不相等的情况,可以回溯,从上次的下一个位置开始,继续逐个匹配,下面是程序:
# includeusing namespace std; # include int main() { int find(string,string ); string s1("hello world "); string s2(" world"); cout<
匹配的过程是:
假设长字符串的长度为n,匹配字符串的长度为m,上面算法的平均复杂度是O(m*n),如果有一下的字符串,s1=”aaaa…b”,前面有100个a,s2=”aaaaab”,用上面的方法进行匹配时,将会回溯95次,这是非常低效的,提高字符串的匹配效率可以用KMP算法。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+IDwvcD4KPHA+MiBLTVDL47eoPC9wPgo8cD5LTVDL47eotcTLvM/rysfA+9PD0tG+rbHIvc+z9rXEveG5+6OsvPXJ2bvYy923osn6tcS0zsr9o6y007b4vbW1zcvjt6i1xLi01NO2yKOsPC9wPgo8cD5LTVDL47eoyrXP1tfWt/u0rsalxeS1xMD919PI58/Co7o8L3A+CjxwPrzZyeizpLSuczE9obFhYmFkYWKhsSxzMj2hsWFiYWNhZKGxPC9wPgrGpcXktcS5/bPMysc6czFbM126zXMyWzNd0/a1vbK7z+C1yLXE19a3+6Os1eLKsW5leHRbM109MSy908/CwLS74bHIvc9zMVszXdPrczJbMV2jrNLyzqpuZXh0WzNdzqoxse3KvnMyWzNdus1zWzNdx7DD5rXE0ru49tfWt/vS0b6tsci9z7n9tvjH0s/gtcijrM/CtM7U2b340NCxyL3PyrGjrDxicj4KPHA+IDwvcD4KPHA+1rvSqsD708PWrsewtcS94bn7o6y+zb/J0tS89cnZu9jL3aGjbmV4dFtqXbXEJiMyMDU0MDvIt7aot723qMrHo7o8L3A+CjxwPqOoMaOpbmV4dFswXT0tMSy12tK7uPbX1rf7tcQmIzIwNTQwO86qLTE8L3A+CjxwPqOoMqOpbmV4dFtqXT0tMSC0rnMy1tDPwrHqzqpqtcTX1rf7o6zI57n70+vK19fWt/vP4M2so6zH0mrHsMPmtcRrLTG49tfWt/vT67+qzbe1xGstMbj219a3+7K7tcijqLvy1d/P4LXItatzMltrXT09czJbal2jqSgxPD1rPGopPC9wPgo8cD6jqDOjqW5leHRbal09ayAgczLW0M/CserOqmq1xNfWt/ujrMjnuftqx7DD5rXEa7j219a3+9Prv6rNt7XEa7j219a3+8/gtcijrMfSczJbal0hPXMyW2tdICAgKDE8PWs8aik8L3A+CjxwPqOoNKOpbmV4dFtqXT0wIMbky/w8L3A+CjxwPsD9yOezpLSuczE9obFiYWFiYWRkYaGxLHMyPaGxYWJhYmOhsTwvcD4KPHA+bmV4dFtqXbfWsfDOqi0xIDAgLTEgMSAyPC9wPgo8cD5uZXh0uq/K/bHtyr63vbeoyOfPwjo8L3A+CjxwPiA8L3A+CjxwcmUgY2xhc3M9"brush:java;">void next(const char *s,int next[]) { int j=0,k=-1; next[0]=-1; while(s[j]!='\0') { if(k==-1||s[j]==s[k]) { +j;++k; if(s[j]!=s[k]) next[j]=k; else next[j]=next[k]; } else k=next[k]; } for(int i=0;i
