用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

求两个字符串最长公共子串的问题 LCS

2012-10-23 作者: 神马举报

[c]代码库

#include<stdio.h>
#include<string.h>
#define N 100
 
//LCS问题就是求两个字符串最长公共子串的问题
char *LCS ( char *a,char *b )
{
    int len_a = strlen ( a );  //获取字串的长度
    int len_b = strlen ( b );
    char *p;
    int c[N][N] = {0};      //矩阵c记录两串的匹配情况
    int start,end,len,i,j;  //start表明最长公共子串的起始点,end表明最长公共子串的终止点
    end = len = 0;          //len表明最长公共子串的长度
    for ( i=0; i<len_a; i++ )    //串开始从前向后比较
    {
        for ( j=0; j<len_b; j++ )
        {
            if ( a[i] == b[j] )
                if ( i == 0 || j == 0 )
                    c[i][j] = 1;
                else
                    c[i][j] = c[i-1][j-1] + 1;
            //  else
            //      c[i][j] = 0;
            if ( c[i][j] > len )
            {
                len = c[i][j];
                end = j;
            }
        }
    }
    start = end - len + 1;
    p = ( char * ) malloc ( len+1 ); //数组p记录最长公共子串
    for ( i=start; i<=end; i++ )
        p[i-start] = b[i];
    p[len] = '\0';
    for ( j=0; j<len_b; j++ )
    {
        for ( i=0; i<len_a; i++ )
            printf ( "%2d",c[i][j] );
        printf ( "\n" );
    }
    return p;
}
int main ( int argc,char *argv[] )
{
    char str1[N],str2[N];
    printf ( "请输入字符串1:" );
    gets ( str1 );
    printf ( "请输入字符串2:" );
    gets ( str2 );
    printf ( "最长子串为:%s\n",LCS ( str1,str2 ) );
    return 0;
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...