今天去面试,面试官出了一道题,求两个字符串的最大公共子串(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;

}

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

  1. C语言找出两个字符串唯一不同的一个字符(附完整源码)

    C语言找出两个字符串唯一不同的一个字符 C语言找出两个字符串唯一不同的一个字符完整源码(定义,实现,main函数测试) C语言找出两个字符串唯一不同的一个字符完整源码(定义,实现,main函数测试) ...

  2. 动态规划算法分析和理解:最长公共子序列、公共子字符串

    定义啥的就不多说了,反正我有自己的理解就行.例题是,最长公共子序列和最长公共子字符串的动态规划求解过程 目录 一.递归和动态规划 二.动态规划求解步骤 三.最长公共子序列 四.最长公共子字符串 一.递 ...

  3. 找出两个字符串中最长的相同子字符串

    //找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...

  4. 程序员面试100题之七:最长公共子字符串

    子字符串的定义和子序列的定义类似,但要求是连续分布在其他字符串中.比如输入两个字符串BDCABA和ABCBDAB的最长公共字符串有BD和AB,它们的长度都是2. 最长公共子字符串共有两种解决方法,下面 ...

  5. 程序员面试100题之七 最长公共子字符串

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 子字符串 ...

  6. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  7. 最长公共子字符串(动态规划)

    X = <a, b, c, f, b, c> Y = <a, b, f, c, a, b> X和Y的Longest Common Substring为 <a, b> ...

  8. java基础—找出两个字符串中最大的子串

    // 找一个字符串的最大子串public static void main(String[] args) {String s1 = "qwerabcdtyuiop";String ...

  9. python按行读字符串,python按行读取文件并找出其中指定字符串

    python怎么提取出文件里的指定内容 python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile ...

最新文章

  1. R语言ggplot2可视化使用geom_ribbon()函数向ggplot2图添加置信度带(Confidence Band、Confidence Interval)
  2. 在UWP 将BitmapImage转换为 WriteableBitmap
  3. 解决EXCEL统计问题的分享
  4. 82. 删除排序链表中的重复元素 II(链表操作)
  5. windows下启动activemq闪退
  6. OCP China Day“登陆”,最新技术、方案吸睛!
  7. js可以控制文件上传的速度吗?
  8. 访问共享文件时切换默认的访问账号
  9. 微信群发机器人源代码
  10. QT5修改windows电脑IP地址
  11. 网络流之dinic算法
  12. 重磅!全球云服务商 IP 地址与分析报告:注册与活跃 IP 告诉你到底哪家云更火...
  13. 八爪鱼-自定义模式采集数据_视频教程执行
  14. win10默认壁纸位置
  15. 渲染书籍目录汇总(不断更新中...)
  16. 芯天下8bit MCU
  17. Ubuntu16.04发热 CPU/GPU温度比win10高解决方法
  18. 【团体天梯赛/PTA】7-34 福到了 (15 分)
  19. Gmail账号申诉成功
  20. 百度百家号作者昵称、ID、粉丝数量获取

热门文章

  1. 比特(bit)_二进制数
  2. Windows下Maven的下载、安装及IntelliJ IDEA集成配置
  3. DOM(document object model),文档对象模型
  4. Java中,为什么子类的构造方法中必须调父类的构造方法?
  5. 如何理解Java的类变量、成员变量、常量、类属性、实例属性、字段(field)、成员方法、类方法
  6. Servlet 运行原理
  7. 解决postman请求乱码问题
  8. html文件压缩成gzip,前端性能优化成神之路-HTTP压缩开启gzip
  9. python操纵excel的方法_python操作Excel的几种方式
  10. java人种_实在看不出藏族有大量矮黑血统