prefix数组的含义:prefix[i]=q表示模式(字串)str2中以元素str2[i]结尾,开头q个元素和最后q个元素相同。(注意:个数和数组下标之前相差1)比较过程中主串下标i一直往前走,当遇到不匹配时,调整字串下标j到可能匹配的位置。 char* my_strstr(const char *str1,const char *str2) { int lengthT = strlen(str1); int lengthP = strlen(str2); int *prefix= new int[lengthP]; prefix[0]=0; int i; int q=0;//匹配的元素个数 //计算前缀数组 for(i=1;i<lengthP;i++) { while(q>0&&str2[q]!=str2[i]) //下一个元素不匹配 q=prefix[q-1]; if(str2[q]==str2[i]) //下一个元素匹配 q=q+1; prefix[i]=q; } for(i=0;i<lengthT;i++) { while(q>0&&str2[q]!=str1[i]) q=prefix[q-1]; if(str2[q]==str1[i]) q=q+1; if(q==lengthP) { delete []prefix; return (char*)str1+i-lengthP+1; } } delete []prefix; return (char*)NULL; }