您的位置:首页 > 运维架构 > Linux

linux kernel data struct : find longest sub string

2013-05-11 14:23 393 查看
今天我们来看看面试 C 中常见,而且比较刁钻的题目:

找出两个字符串中的最大相同子串,如:

str1: "mmmabckkk"

str2: "oabclll"

那么最大相同子串为:abc

以下为我与同事讨论最后的思路及解法,希望对大家有所启发。

基本思路为:短串中以最大的长度作为窗口,以后窗口依次减一;

            遍历短串的窗口字符

            遍历长串的窗口字符

            比较

以下为C实现,调试环境为Dev-C:

#include <stdio.h>

#include <stdlib.h>

typedef unsigned int uint;

struct longest_sub_str {

       uint l_cursor;

       uint s_cursor;

       uint window;

       }LSS;

//s1 == s2, return 1, else return 0      

uint strEqual(char *s1, char *s2, uint count)

{

     printf("==========\n");

     printf("s1: %s\n",s1);

     printf("s2: %s\n",s2);

     printf("==========\n");

     while(count--)

     {

         if(*(s1+count) != *(s2+count)) return 0;

     }

     return 1;

}

      

struct longest_sub_str *find_longest_sub_str(char *s1, char *s2)

{

     uint m,window,n;

     char *l_str_p, *s_str_p;

     uint l_str_len, s_str_len;

    

     uint len1 = strlen(s1);

     uint len2 = strlen(s2);

    

     //judge long and short string

     if(len1 >= len2)

     {

             l_str_len = len1;

             s_str_len = len2;

            

             l_str_p = s1;

             s_str_p = s2;

     }

     else

     {

             l_str_len = len2;

             s_str_len = len1;

            

             l_str_p = s2;

             s_str_p = s1;        

     }

    

     printf("long string is: %s. length is: %d\n",l_str_p,l_str_len);

     printf("short string is: %s. length is: %d\n",s_str_p,s_str_len);

    

     //The next three "for" are very important

     //window

     for(window = s_str_len; window > 0; window--)     

     {   //short string cursor

         for(m = 0; window+m <= s_str_len; m++)

         {    //long string cursor

              for(n = 0; n < l_str_len; n++)

              {

                    if(strEqual(l_str_p+n, s_str_p+m, window))

                    {

                        LSS.l_cursor = n;

                        LSS.s_cursor = m;

                        LSS.window = window;

                       

                        return &LSS;

                    }

              }//long string cursor end   

         }//short string cursor end

     }//window end

    

     return 0;    

}

main()

{

 char *str2 = "mmabcm";

 char *str1 = "oabcl";

 

 //char *str2 = "deidkvnkadslldisead;iiswefdvcxlse";

 //char *str1 = "mmmmswefdxxx";

 

 printf("Hello world !\n\n");

 

 printf("*********************\n");

 printf("str1 = %s\n",str1);

 printf("str2 = %s\n",str2);

 

 LSS.l_cursor = 0;

 LSS.s_cursor = 0;

 LSS.window = 0;

     

 if(find_longest_sub_str(str1, str2))

 {

  printf("longest sub string is: \n");

  printf("long str cursor: %d\n", LSS.l_cursor);

  printf("short str cursor: %d\n", LSS.s_cursor);

  printf("window is: %d\n", LSS.window);

  printf("*********************\n"); 

 }

 else

 {

  printf("no longest sub string\n");

 }  

     

 system("pause");

}

 

运行结果为:

Hello world !

*********************

str1 = oabcl

str2 = mmabcm

long string is: mmabcm. length is: 6

short string is: oabcl. length is: 5

==========

s1: mmabcm

s2: oabcl

==========

==========

s1: mabcm

s2: oabcl

==========

==========

s1: abcm

s2: oabcl

==========

==========

s1: bcm

s2: oabcl

==========

==========

s1: cm

s2: oabcl

==========

==========

s1: m

s2: oabcl

==========

==========

s1: mmabcm

s2: oabcl

==========

==========

s1: mabcm

s2: oabcl

==========

==========

s1: abcm

s2: oabcl

==========

==========

s1: bcm

s2: oabcl

==========

==========

s1: cm

s2: oabcl

==========

==========

s1: m

s2: oabcl

==========

==========

s1: mmabcm

s2: abcl

==========

==========

s1: mabcm

s2: abcl

==========

==========

s1: abcm

s2: abcl

==========

==========

s1: bcm

s2: abcl

==========

==========

s1: cm

s2: abcl

==========

==========

s1: m

s2: abcl

==========

==========

s1: mmabcm

s2: oabcl

==========

==========

s1: mabcm

s2: oabcl

==========

==========

s1: abcm

s2: oabcl

==========

==========

s1: bcm

s2: oabcl

==========

==========

s1: cm

s2: oabcl

==========

==========

s1: m

s2: oabcl

==========

==========

s1: mmabcm

s2: abcl

==========

==========

s1: mabcm

s2: abcl

==========

==========

s1: abcm

s2: abcl

==========

longest sub string is:

long str cursor: 2

short str cursor: 1

window is: 3

*********************

请按任意键继续. . .

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C find sub string