/**/ /*NO.1O(n^2)的算法:*/ /**/ /*枚举主串的每一个位置开始比较*/ #include < stdio.h > #define MAX 101 int main( void ) ... { char a[MAX],b[MAX]; int la=0,lb=0,i,j,k ; char c ; while ( (c =getchar())!= ' ') a[++la] = c ; while ( (c =getchar())!= ' ') b[++lb] = c ; for(i=1 ; i<=la ; i++) ...{ for(j=1,k=i; j<= lb && (b[j] == a[k]) ; j++,k++) ; if ( j > lb ) break ; } if ( j > lb) printf("No.%d ",i); else printf("No Soulation!!! "); system("pause"); return 0 ;} /**/ /*No.2 O(a+b) 的算法:该算法是由knuth 等三个人想出来的,简称为:KMP 算法基本思想是:一般的算法为什么这么低效呢?那是因为主串指针回溯情况过多:主串指针如果不回溯的话,速度就会加快,那我们就会想:如何让主串指针不回溯?KMP算法就是解决了这个问题,所以速度变得更快速了它是这样子的:用一个数组:next[] 求得失配时的位置,然后保存下来,具体请看如下程序:*/ */ #include < stdio.h > #include < stdlib.h > #include < string .h > #define MAX 101 void get_next( int * next, char * a, int la) /**/ /*求NEXT[]的值*/ ... { int i=1,j=0 ; next[1] = 0 ; while ( i <= la) /**//*核心部分*/ ...{ if( a[i] == a[j] || j == 0 ) ...{ j ++ ; i ++ ; if( a[i] == a[j]) next[i] = next[j]; else next[i] = j ; } else j = next[j] ; }} int str_kmp( int * next, char * A , char * a, int lA, int la) /**/ /* EASY*/ ... { int i,j,k ; i = 1 ; j = 1 ; while ( i<=lA && j <= la ) ...{ if(A[i] == a[j] || j == 0 ) ...{ i ++ ; j ++ ; } else j = next[j] ; } if ( j> la) return i-j+1 ; else return -1 ;} int main( void ) ... { int n,k; int next[MAX]=...{0} ; int lA=0,la =0 ; char A[MAX],a[MAX] ; scanf("%s %s",A,a) ; lA = strlen(A); la = strlen(a); for(k=la-1; k>= 0 ;k --) a[k+1] = a[k] ; for(k=lA-1; k>= 0 ;k --) A[k+1] = A[k] ; get_next(next,a,la) ; k = str_kmp(next,A,a,lA,la); if ( -1 == k) printf("Not Soulation!!! "); else printf("%d ",k) ; system("pause"); return 0 ;}