借助字符串函数的朴素算法

 

  1. #include<stdio.h> 
  2. #include<string.h> 
  3. #define MAXSIZE 50 
  4. int index(char s1[],char s2[],int pos); 
  5. int main(void){ 
  6.     char string1[MAXSIZE];//主串  
  7.     char string2[MAXSIZE];//子串  
  8.      
  9.     int pos;//从第pos个字符开始匹配,包括第pos个字符!pos的取值范围从0开始 
  10.     int result; 
  11.      
  12.     puts("Enter the string1"); 
  13.     gets(string1); 
  14.     puts("Enter the string2"); 
  15.     gets(string2); 
  16.     puts("Enter the begin"); 
  17.     scanf("%d",&pos); 
  18.     while(getchar() != '\n'
  19.         continue
  20.     result = index(string1,string2,pos); 
  21.     printf("%d",result); 
  22.     getchar(); 
  23.     return 0; 
  24. }      
  25. int index(char s1[],char s2[],int pos){ 
  26.     char temp[MAXSIZE];//存储截取的部分主串 
  27.     int s1Length = strlen(s1);//主串长度  
  28.     int s2Length = strlen(s2);//子串长度  
  29.      
  30.     if(pos<0){//pos最小取0  
  31.         return -1; 
  32.     } 
  33.     while(pos<=s1Length-s2Length){//从pos到主串结束的长度必须大于等于子串  
  34.         strncpy(temp,s1+pos,s2Length);//截取  
  35.         temp[s2Length] = '\0';//截取之后要添加终止符  
  36.         if(!strcmp(temp,s2)){ 
  37.             return pos; 
  38.         } 
  39.         else
  40.             pos++; 
  41.         } 
  42.     } 
  43.     return -1;//如果没找到,则返回-1  
  44.       

不借助字符串函数的朴素函数

 

  1. #include<stdio.h> 
  2. #include<string.h> 
  3. #define MAXSIZE 50 
  4. int index(char s1[],char s2[],int pos); 
  5. int main(void){ 
  6.     char string1[MAXSIZE];//主串  
  7.     char string2[MAXSIZE];//子串  
  8.      
  9.     int pos;//从第pos个字符开始匹配,包括第pos个字符!pos的取值范围从0开始 
  10.     int result; 
  11.      
  12.     puts("Enter the string1"); 
  13.     gets(string1); 
  14.     puts("Enter the string2"); 
  15.     gets(string2); 
  16.     puts("Enter the begin"); 
  17.     scanf("%d",&pos); 
  18.     while(getchar() != '\n'
  19.         continue
  20.     result = index(string1,string2,pos); 
  21.     printf("%d",result); 
  22.     getchar(); 
  23.     return 0; 
  24. int index(char s1[],char s2[],int pos){ 
  25.     int s1Length = strlen(s1); 
  26.     int s2Length = strlen(s2); 
  27.     int result = -1;//返回值  
  28.      
  29.     if(pos<0){ 
  30.         return -1; 
  31.     } 
  32.     while(pos<=s1Length-s2Length){ 
  33.         int count = 0;//内层循环  
  34.         int save = pos;//存储pos的位置  
  35.         while(count<s2Length){//内层循环开始  
  36.             if(s1[pos] == s2[count]){//如果字符相等,继续比较  
  37.                 pos++; 
  38.                 count++; 
  39.                 continue
  40.             } 
  41.             else{//只要有一个不等,就立刻终止内层循环  
  42.                 break
  43.             } 
  44.         } 
  45.         if(count == s2Length){//判断内层循环是否完全进行了,如果完全进行了,结束外层循环并返回  
  46.             result = save; 
  47.             break
  48.         } 
  49.         else{//否则更新pos值和save值,继续外层循环  
  50.             pos = ++save; 
  51.         } 
  52.     } 
  53.     return result; 
  54.       

kmp函数

 

  1. int main() 
  2.     int n; 
  3.     int pos; 
  4.     char s[MAXSIZE]; 
  5.     char t[MAXSIZE]; 
  6.     puts("Enter string1:"); 
  7.     gets(s); 
  8.     puts("Enter string2:"); 
  9.     gets(t); 
  10.     puts("Enter begin pos:"); 
  11.     scanf("%d",&pos); 
  12.      
  13.     get_next(t,next); 
  14.     n=index_KMP(s,t,pos);//从pos开始找寻,包括pos位置  
  15.     printf("%d",n); 
  16.     while(getchar()!='\n'
  17.         continue
  18.     getchar(); 
  19.     return 0; 
  20.  
  21. int index_KMP(char *s,char *t,int pos) 
  22.     int i=pos,j=1;//j为1,i为pos的值  
  23.     while (i<=(int)strlen(s)&&j<=(int)strlen(t))//i要小于等于原串的大小,j要小于子串的大小  
  24.     { 
  25.         if (j==0||s[i]==t[j-1])//如果j==0说明必须要向后推,如果对应位置上相等也需要向后推  
  26.         { 
  27.             i++;//推动i  
  28.             j++;//推动j  
  29.         } 
  30.         else j=next[j];//否则j回到它回溯的地方  
  31.     } 
  32.     if (j>(int)strlen(t))//这说明子串已经遍历完成了  
  33.         return i-strlen(t);//返回具体的位置  
  34.     else  
  35.         return -1;//没有找到  
  36.  
  37. void get_next(char *t,int *next)//t为子串,next为子串j回溯时移动到第几个字符处,字符从1开始  
  38.      
  39.     int i=1,j=0;//固定i=1,j=0  
  40.     next[0]=next[1]=0;//next数组的第0和第1个都为0  
  41.     while (i<(int)strlen(t))//i应该小于子串的长度  
  42.     { 
  43.         if (j==0||t[i]==t[j])//如果j==0或者字符前缀新增和字符后缀新增相等  
  44.         { 
  45.             i++; 
  46.             j++; 
  47.             next[i]=j;//next位置上的数比前一大1  
  48.         } 
  49.         else j=next[j];//否则回溯到j的最开始外置  
  50.     }