天天看點

簡單的 字元串比較函數 易懂 複雜度

1.簡單的字元串比對函數

簡單的字元串比對很簡單,就是一個兩重循環。

算發一:

#include<stdio.h>

#include<string.h>

char s[51],t[11];

int next[11];

int cnt[11];

void index(char*s,char *t,int pos)

{

       int i,j,k;

    int x = 0;

    int len1 = strlen(s);

    int len2 = strlen(t);

    for(i=pos;i<len1;i++)

    {

        k = i;

        for(j=0;j<len2;j++)

        {           

            if(s[k++]!=t[j])

                break;

        }

        if(j>=len2)

        {

            cnt[x++] = i;

        }

    }

}

int main(void)

{

    memset(cnt,-1,11*sizeof(int));

    gets(s);

    gets(t);

    int pos;

    scanf("%d",&pos);

       index(s,t,pos);

    for(int i=0;cnt[i]!=-1;i++)

    {

        printf("    %d",cnt[i]);

    }

return 0;

}

下面分析其複雜度:  

簡單的 字元串比較函數 易懂 複雜度

除了在index2,index4,index6,index10四處字元串比較了多次外,在其他地方字元串隻比較了一次,總共的比較次數為(n-m+1)+(m-1)+others,others為紅色的部分,也就是說其複雜度接近O(n+m)。

假設主串的長度為n,模式串的長度為m,在最壞情況下,對于主串(n-m+1)中的每一個字元,都要和模式中的字元比對m次,後面的每個字元的比對次數總共為(1+2+…+(m-1))=m(m-1)/2,則總的比對次數為(n-m+1)*m+ m(m-1)/2,也即算發複雜度為O(n*m)。

  上面這種方法比較的直覺和簡單,但是複雜度卻很高,效率低下,很難應用于實際,下面有個改進的版本,功能是輸出第一次出現子串的索引。

算發二:

#include <stdio.h>

#include <string.h>

char s[51],t[11];

int next[11];

int index(char *s,char *t,int pos)

{

    int i =pos-1;

    int j = 0;

    int len1=  strlen(s);

    int len2 =strlen(t);

   while(i<len1&&j<len2)

    {

       if(s[i]==t[j])

        {

            i++;

            j++;

        }

        else

        {

            i -=j-1;

            j =0;

        }

    }

       if(j>=len2)

    {

       returni-len2;

    }

    else

       return-1;

}

int main(void)

{

    gets(s);

    gets(t);

    int pos;

   scanf("%d",&pos);

    int no =index(s,t,pos);

    if(no>0)

       printf("String s contains substring t at index of %d~~\n",no);

    else

       printf("String s does not contain substring t~~\n");

    return 0;

}

下面讓我們來分析其複雜度,

簡單的 字元串比較函數 易懂 複雜度

除了在index2,index4,index6,index10四處字元串比較了多次外,在其他地方字元串隻比較了一次,假設最終查找到子串的位置為index,在一次查找過程中,最終的比較次數為(index+len2-1)+others,這個others就是之前有過的多次比較的結果。其複雜度接近O(n+m)。在最壞的情況下,其複雜度也是O(n*m)。

算發三:

#include <stdio.h>

#include <string.h>

char s[51],t[11];

int next[11];

int cnt[11];

void index(char *s,char *t,int pos)

{

   intx=0;

   int i = pos-1;

   int j = 0;

   int len1 =  strlen(s);

   int len2 = strlen(t);

   for(i=pos-1;i<len1;)

    {

       while(i<len1&&j<len2)

       {

           if(s[i]==t[j])

           {

                i++;

                j++;

           }

           else

           {

               i -= j-1;

               j = 0;

           }

       }

          if(j>=len2)

       {

          cnt[x++] = i-len2;

             i -= len2-1;

             j = 0;

       }

   }   

}

int main(void)

{

   memset(cnt,-1,11*sizeof(int));

   gets(s);

   gets(t);

   int pos;

   scanf("%d",&pos);

   index(s,t,pos);

   for(int i=0;cnt[i]!=-1;i++)

    {

       printf("    %d",cnt[i]);

    }

   printf("\n");

   return 0;

}

繼續閱讀