c语言-C语言经典例题:求最大公共字符串

问题描述

C语言经典例题:求最大公共字符串

自己编写了很久都没写出来,求大神共享一下代码,就是给定两个字符串,求最大的公共子串,新手

解决方案

刚才那个有点错漏

 #include <stdio.h>
#include <string.h>

void getMaxCommonSubstring(char*,char*);

int main(){
    char str1[1000],str2[1000];
    scanf("%s",str1);
    scanf("%s",str2);
    getMaxCommonSubstring(str1,str2);
    return 0;
}

//得到两个字符串的最大公共子串并输出
//如果有多个最大子串只输出第一个
void getMaxCommonSubstring(char* str1,char* str2){
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    //保存最大字符串及其长度
    int maxLen = 0;
    char maxStr[1000]={0};
    //对str1和str2进行遍历
    int i,j,k;
    for(i=0;i<len1;i++){
        for(j=0;j<len2;j++){
            //如果某个字符相同,则继续看后面最多有几个相同
            if(str1[i]==str2[j]){
                //保存已匹配的字符串及其长度
                int len = 1;
                char buff[1000]={0};
                buff[0]=str2[j];
                //对后面的字符遍历
                for(k=1;i+k<len1&&j+k<len2;k++){
                    //字符不相同则跳出
                    if(str1[i+k]!=str2[j+k])break;
                    buff[len++]=str2[j+k];
                }
                //如果匹配的字符串比原来的最大字符串更大,则拷贝到最大字符串
                if(len>maxLen){
                    maxLen=len;
                    strcpy(maxStr,buff);
                }
            }
        }
    }
    printf("MaxCommonSubstring:n%snlength:%dn",maxStr,maxLen);
}

解决方案二:

百度一下不是很多嘛
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int longest_common_substring(char str1, char *str2)
{
int i,j,k,len1,len2,max,x,y;
len1 = strlen(str1);
len2 = strlen(str2);
int **c = new int
[len1+1];
for(i = 0; i < len1+1; i++)
c[i] = new int[len2+1];
for(i = 0; i < len1+1; i++)
c[i][0]=0; //第0列都初始化为0
for(j = 0; j < len2+1; j++)
c[0][j]=0; //第0行都初始化为0
max = -1;
for(i = 1 ; i < len1+1 ; i++)
{
for(j = 1; j < len2+1; j++)
{
if(str1[i-1]==str2[j-1]) //只需要跟左上方的c[i-1][j-1]比较就可以了
c[i][j]=c[i-1][j-1]+1;
else //不连续的时候还要跟左边的c[i][j-1]、上边的c[i-1][j]值比较,这里不需要
c[i][j]=0;
if(c[i][j]>max)
{
max=c[i][j];
x=i;
y=j;
}
}
}

//输出公共子串
char s[1000];
k=max;
i=x-1,j=y-1;
s[k--]='';
while(i>=0 && j>=0)
{
    if(str1[i]==str2[j])
    {
        s[k--]=str1[i];
        i--;
        j--;
    }
    else       //只要有一个不相等,就说明相等的公共字符断了,不连续了
        break;
}
printf("最长公共子串为:");
puts(s);
for(i = 0; i < len1+1; i++)         //释放动态申请的二维数组
    delete[] c[i];
delete[] c;
return max;

}
int main(void)
{
char str1[1000],str2[1000];
printf("请输入第一个字符串:");
gets(str1);
printf("请输入第二个字符串:");
gets(str2);
int len = longest_common_substring(str1, str2);
printf("最长公共连续子串的长度为:%dn",len);
system("pause");
return 0;
}

解决方案三:

 #include <stdio.h>
#include <string.h>

void getMaxCommonSubstring(char*,char*);

int main(){
    char str1[1000],str2[1000];
    scanf("%s",str1);
    scanf("%s",str2);
    getMaxCommonSubstring(str1,str2);
    return 0;
}

//得到两个字符串的最大公共子串并输出
//如果有多个最大子串只输出第一个
void getMaxCommonSubstring(char* str1,char* str2){
    int len1 = strlen(str1);
    int len2 = strlen(str2);
    //保存最大字符串及其长度
    int maxLen = 0;
    char maxStr[1000]={0};
    //对str1和str2进行遍历
    int i,j,k;
    for(i=0;i<len1;i++){
        for(j=0;j<len2;j++){
            //如果某个字符相同,则继续看后面最多有几个相同
            if(str1[i]==str2[j]){
                //保存已匹配的字符串及其长度
                int len = 1;
                char buff[1000]={0};
                buff[0]=str2[j];
                //对后面的字符遍历
                for(k=1;i+k<len1&&j+k<len;k++){
                    //字符不相同则跳出
                    if(str1[i+k]!=str2[j+k])break;
                    buff[len++]=str2[j+k];
                }
                //如果匹配的字符串比原来的最大字符串更大,则拷贝到最大字符串
                if(len>maxLen){
                    maxLen=len;
                    strcpy(maxStr,buff);
                }
            }
        }
    }
    printf("MaxCommonSubstring:n%snlength:%dn",maxStr,maxLen);
}
时间: 2024-09-20 00:23:43

c语言-C语言经典例题:求最大公共字符串的相关文章

求解决-怎么用C语言编写这个程序,求指教

问题描述 怎么用C语言编写这个程序,求指教 本题要求编写程序计算某年某月某日是该年中的第几天. 输入格式: 输入在一行中按照格式"yyyy/mm/dd"(即"年/月/日")给出日期.注意:闰年的判别条件是该年年份能被4整除但不能被100整除.或者能被400整除.闰年的2月有29天. 输出格式: 在一行输出日期是该年中的第几天. 输入样例1: 2009/03/02 输出样例1: 61 输入样例2: 2000/03/02 输出样例2: 62 解决方案 网上一搜有很多,c

用Keil、C语言对C8051F310编程,求例程。。

问题描述 用Keil.C语言对C8051F310编程,求例程.. 随意的例程就行如果有按键消抖,数码管显示,占空比调节就更好了感激不尽! 解决方案 硬件电路图都没有--

c语言-C语言 关于用矩形法求定积分

问题描述 C语言 关于用矩形法求定积分 #include""stdio.h""#include""math.h""int main(){ double fun1(double x); double fun2(double x); double fun3(double x); double calc(double adouble bdouble (*p)(double)); int type; double ab; double

c语言-C语言的一个程序,求大神

问题描述 C语言的一个程序,求大神 三.实验内容 1.实验题目:手动输入10个0~100之内的整数,按从小到大排列输出.: (1)要求 排序算法: 使数组从小到大排序的规则如下: ⑴ 设数组为a[0],a[1],-,a[n-1],构造i循环从0,1,-,n-2变化,构造j循环从i+1,i+2,-,n-1变化,即j>i. ⑵ 对于任何一个a[i],如果a[i]>a[j],表面前面有一个元素a[i]比它后面的元素a[j]大,a[i]应该在后面,a[j]应该在前面,交换a[i]与a[j]. ⑶ 对于

编程c语言-c语言版的数据结构中求图的遍历

问题描述 c语言版的数据结构中求图的遍历 调试时为什么会出现已停止工作??具体情况是出现了一个问题,导致程序停止正常工作,如果有可用的解决方案,Windiws将关闭程序并通知你 解决方案 贴出你的代码.代码是调试才能发现错误的.哪有看代码看出错误的. 你自己也要学会调试. 解决方案二: 数据结构(C语言版)规范代码之图(邻接多重表遍历)数据结构(C语言版)摘录--树和二叉树数据结构(C语言版)摘录--图 解决方案三: 看着真费劲.有malloc申请内存,没看到有free呢.

c语言-C语言的一个小问题 求解答

问题描述 C语言的一个小问题 求解答 计算机问题求解答">如题 我的代码是这样 #includeint main(){ double xy; printf(""输入数据:""); scanf(""%lf""&x); if(x<1) y=x;else if(x>=1&&x<=10) y=2*x-1;else if(x>10) y=3*x-11;printf(&quo

基础-请问一个C语言奇怪的问题,求大神

问题描述 请问一个C语言奇怪的问题,求大神 //加了所有需要的头文件intmain(int argc char **argv){ struct event timeout; struct timeval tv; struct event_base *base; int flags; //printf(""pathvar=%s""getenv(""PATH"")); 注释1#ifdef WIN32 WORD wVersionRe

fanbao-c语言里面的问题,求大神解决

问题描述 c语言里面的问题,求大神解决 请问一下,如果用c编写了一个闹钟,那么怎么在电脑上运行这个程序时出现的是一个时钟的样子? 解决方案 用MFC或者WIN32来做 解决方案二: 可以去学习下VC的界面编程

【c语言】2维数组求平均值,指针出问题了

问题描述 [c语言]2维数组求平均值,指针出问题了 double average(double (*p)[],double *q,int n,int m) { int i,j; double NU,AE;//每列总和与每行总和 for(i=0;i<n;i++) { for(NU=0,j=0;j<m;j++) { NU+=(*p+i)[j];//每列的和 } q[i]=NU/m;//每行的平均值 AE+=NU;//每行的和 } return AE/(n*m);//总平均值 } 第一行的平均值没错