linux kernel data struct : find longest sub string

今天我们来看看面试 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
*********************
请按任意键继续. . .

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值