c语言找出公共子字符串,经典C语言面试题:求解最大公共子串

今天去面试,面试官出了一道题,求两个字符串的最大公共子串(Longest Common Substring),一听起来不是很难,但让我在纸上写着写着就迷糊了。回来特地网搜了一下。面试

下面经过两种方法来求两个字符串的最大连续公共子串。数组

方法1:暴力解法code

将字符串s1和s2分别写在两把直尺上面,而后将s1固定,s2的头部和s1的尾部对齐,而后逐渐移动直尺s2,比较重叠部分的字符串中的公共子串的长度,直到直尺s2移动到s1的头部。在这个过程当中求得的最大长度就是s一、s2最大子串的长度。内存

#include

#include

#include

char* longest_common_substring(char *str1,char *str2)

{

int str1len = strlen(str1);

int str2len = strlen(str2);

int i,j,index,max=0,num=0;

int start;

//将两个字符串看作两个直尺,固定一个直尺,另一个从头至尾开始移动,逐一与固定的直尺比较值。

for(i = 0; i < str1len; i++)

{

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

{

//这里的start一、start2是比较关键的

int start1=i;

int start2=j;

while((start1 <= str1len-1) && (start2 <= str2len-1) && (str1[start1++] == str2[start2++]))

num++;

if(num > max)//若是num是当前最大匹配的个数,则赋给max,而且在start记下str1最长匹配开始的位置

{

max=num;

start=i;

}

num=0;//若是num不是当前最大的,则赋为0值继续循环

}

}

char *str=(char *)malloc(max + 1);

strncpy(str,str1 + start,max);//从字符串str1的start位置开始,拷贝max个字符到str中,这就是咱们找出的最大子串

str[max] = '\0';

printf("最长公共连续子串的长度为:%d\n",max);

return str;

}

int main()

{

char str1[1000],str2[1000];

printf("请输入第一个字符串:");

gets(str1);

printf("请输入第二个字符串:");

gets(str2);

char *str= longest_common_substring(str1,str2);

printf("%s\n",str);

free(str); //记得要free,不然形成内存泄露

system("pause");

return 0;

}

方法2:动态规划解法字符串

主要是定义了一个二维数组,这个数组c用来保存str1中每一个字符向前能与str2中的字符匹配的个数。每次会将最大的匹配个数保存到max变量中,而且记录拥有max的字符在原字符串中的位置。get

当str1[i] == str2[j]时,子序列长度c[i][j] = c[i - 1][j - 1] + 1;只是当str1[i] != str2[j]时,c[i][j]长度要为0,而不是max{c[i - 1][j], c[i][j - 1]}。string

/**

找出两个字符串的最长公共连续子串的长度

**/

#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--]='\0';

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("最长公共连续子串的长度为:%d\n",len);

system("pause");

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中如何防止输入的格式存在错误,C语言如何避免输入

C语言如何处理输入下面这个题&#xff0c;数据的处理很简单&#xff0c;方法也很多。但是数据的输入如何处理呢&#xff0c;还要分多行输入&#xff01;&#xff01;引用标题&#xff1a;错误票据某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。每张票据有唯一的ID号…

lucene 增加相关性_事务性Lucene

lucene 增加相关性许多用户不喜欢Lucene API的事务性语义&#xff0c;以及这在搜索应用程序中如何有用。 首先&#xff0c;Lucene实现了ACID属性&#xff1a; 一个 tomicity&#xff1a;当您在更改&#xff08;添加&#xff0c;删除文件&#xff09; IndexWriter会话&#xff…

新版ipados可以编辑C语言吗,iPadOS新增了五个有用的功能,看你需不需要

主屏幕上的可自定义小部件苹果通过“ iOS 14”对“小工具”进行了大修&#xff0c;引入了新的设计&#xff0c;功能和自定义选项。这些“小部件”也出现在在iPhone上&#xff0c;您可以抓住任何小部件并将其添加到应用程序图标旁边的“主屏幕”中&#xff0c;但是不能在“ iPad…

JavaParser生成,分析和修改Java代码

作为开发人员&#xff0c;我们经常鄙视手动进行重复工作的人员。 我们认为&#xff0c; 他们应该实现这一目标 。 尽管如此&#xff0c;我们还是进行与编码有关的所有活动。 当然&#xff0c;我们使用的高级IDE可以为我们执行一些重构&#xff0c;但这基本上就是结束了。 我们…

C语言去括号编程题,去括号 - C语言网

题目描述当老师不容易&#xff0c;尤其是当小学的老师更难:现在的小朋友做作业喜欢滥用括号。虽然不影响计算结果&#xff0c;但不够美观&#xff0c;容易出错&#xff0c;而且可读性差。但又不能一棒子打死&#xff0c;也许他们就是将来的“陈景润”呢&#xff01;为了减轻老师…

c语言中删除有序数组中重复元素,去除有序列表中的重复元素

2014-10-27 09:13:00更新你仔细研究一下我写的 testAsignPoint 和 testAsignPointAgain 函数就会明白为什么你的二级指针无效了。还是那句话&#xff0c;你要记住&#xff0c;指针就是一个变量&#xff0c;存的是32位数据&#xff0c;记住这个才能真正的理解指针。另外 pezy 说…

阿卡接口_阿卡vs风暴

阿卡接口我最近在Twitter的Storm上工作了一段时间&#xff0c;这让我想知道&#xff0c;它与另一个高性能的并发数据处理框架Akka相比如何 。 什么是Akka和Storm&#xff1f; 让我们从两个系统的简短描述开始。 Storm是一种分布式实时计算系统。 在Storm集群上&#xff0c;您执…

c 语言已知两点求第三点,已知3点座标,求第一点到第二点和第三点构成的直线的距离。...

已知3点座标&#xff0c;求第一点到第二点和第三点构成的直线的距离。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;已知3点座标&#xff0c;求第一点到第二点和第三点构成的直线的距离。解…

连续交付友好的Maven版本

持续交付管道需要可预测的软件和依赖版本。 Maven软件项目中常见的快照版本与“持续交付”背后的动机背道而驰。 为了将快照版本更新为发行版本&#xff0c;开发人员通常手动或通过诸如maven-release-plugin来编辑pom.xml文件。 但是&#xff0c;Maven还提供了将版本号定义为属…

android u盘检测工具,android USBU盘 接入检测

如果是在注册的静态广播一般必须含有以上的权限&#xff0c;这里必须注意添加如果在代码中注册广播则必须iFilter.addDataScheme("file")这样接受广播判断U盘public class RemovableDiskManagerReceiver extends BroadcastReceiver {public RemovableDiskManagerRece…

android 组合属性动画,Android属性动画组合(sequence串行、together并行)

在android中用原生api实现一系列复杂动画会很麻烦&#xff0c;所以对属性动画进行了一定封装&#xff0c;让使用起来更简单&#xff0c;能够按照人的思维依次编写动画。简单效果&#xff1a;使用方法&#xff1a;添加依赖&#xff1a;dependencies { compile"com.steven:A…

jta atomikos_带有Atomikos示例的Tomcat中的Spring JTA多个资源事务

jta atomikos在本教程中&#xff0c;我们将向您展示如何使用Atomikos Transaction Manager在Tomcat服务器中实现JTA多个资源事务。 Atomicos事务管理器为分布式事务提供支持。 这些是多阶段事务&#xff0c;通常使用多个数据库&#xff0c;必须以协调的方式提交。 分布式事务由…

android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程

转载自http://blog..net/xiashaohua/article/details/53842337只简单描述调用过程&#xff0c;需对照代码看&#xff0c;不画图了&#xff0c;也不贴代码)1.在key Event处理部分&#xff0c;Phonewindow会捕获到音量按键事件&#xff0c;Phonewindow.onkeydown--MediaSessionLe…

台电+android+电话,通话系统_台电 G17s_平板电脑评测-中关村在线

通话系统将两张联通3G的SIM卡插入台电G17s之后&#xff0c;我们来感受一下它通话系统的使用是否令人满意。和一般的双卡Android手机平板一样&#xff0c;该机也不支持热插拔&#xff0c;需要将机器彻底关闭后插入SIM卡再开机。并且在开机后屏幕会弹出SIM卡信息&#xff0c;并询…

在Payara Server和GlassFish中配置密码

回答Stackoverflow问题可以为我发现我最喜欢的开源工具的正式文档中的空白提供很好的反馈。 我在这里回答的问题之一是如何在docker容器中更改Payara Server主密码 。 显然&#xff0c;在标准服务器安装中&#xff0c;这很简单–只需使用asadmin change-master-password命令&am…

功能Java示例 第2部分–讲故事

这是称为“ Functional Java by Example”的系列文章的第2部分。 我在本系列的每个部分中发展的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在上一部分中&#xff0c;我从一些原始代码开始&#xff0c;并应用了一些重构来描述“什么”而不是“如何”。 为了帮助代…

OpenHub框架–下一个有趣的功能

这是有关OpenHub框架的系列文章中的第三篇&#xff0c;第一篇介绍OpenHub框架 &#xff0c;第二篇介绍异步消息传递模型 。 该系列的最后一篇文章将更详细地介绍其他一些有趣的功能&#xff0c;并说明为什么OpenHub可以成为您的集成项目的理想选择的原因。 节流 节流是一种功…

tcga癌症亚型获取_将亚型多态性与通用多态性相关联的危险

tcga癌症亚型获取Java 5已将通用多态性引入Java生态系统。 即使我们都知道由于泛型类型擦除及其后果而引起的无数警告&#xff0c;这还是对Java语言的重要补充。 通用多态性&#xff08;也称为参数多态性 &#xff09;通常与可能预先存在的亚型多态性正交。 一个简单的例子是co…

在生产中运行Java:SRE的观点

作为站点可靠性工程师 &#xff08;SRE&#xff09;&#xff0c;我确保我们的生产服务高效&#xff0c;可扩展且可靠。 典型的SRE是生产大师&#xff0c;必须对更广泛的体系结构有很好的了解&#xff0c;并精通许多更精细的细节。 SRE是会说多种语言的程序员&#xff0c;这是很…

android 退出多个activity,Android 中 退出多个activity的经典方法

1.使用list集合方式用list保存activity实例&#xff0c;然后逐一干掉import java.util.linkedlist;import java.util.list;import android.app.activity;import android.app.alertdialog;import android.app.application;import android.content.dialoginterface;import androi…