【字符串处理算法】获取最长公共子串的算法设计及C代码实现

今天讲讲获取最长公共子串的算法设计及C代码实现的知识。

今天讲讲获取最长公共子串算法设计及C代码实现的知识。

一、需求描述

输入两个字符串,编写程序获取这两个字符串的***个最长公共子串。

例如,输入的字符串为“abcdef”和“fecdba”,那么这两个字符串的***个最长公共子串为“cd”。

二、算法设计

我们可以首先寻找两个字符串中的***个相等的字符,然后分别向后移动来比较对应位置的字符是否相等。

即如果字符串1为“1234abcd”,字符串2为“abd”,那么首先发现字符串1中的第五个字符“a”与字符串2中的***个字符“a”相等,接着字符串1中的第六个字符“b”与字符串2中的第二个字符“b”相等,再接着发现字符串1中的第七个字符“c”与字符串2中的第三个字符“d”不相等,此时比较结束。也就是说字符串1和字符串2的最长公共子串为“ab”。

算法

三、特殊流程考虑

在编写程序的过程中,我们要对输入的字符串的长度及格式多做考虑,如:

1.如果输入的两个字符串之一含有中文字符,那么程序直接返回而不执行后续流程。

2.如果输入的两个字符串之一含有空格,那么程序获取空格之前的字符串进行后续操作。

四、程序代码

  1. /**********************************************************************
  2. *版权所有(C)2016,ZhouZhaoxiong。
  3. *
  4. *文件名称:GetLCS.c
  5. *文件标识:无
  6. *内容摘要:寻找两个字符串的最长公共子串
  7. *其它说明:例如,"abcdef"和"bcf"的最长公共子串是"bc"
  8. *当前版本:V1.0
  9. *作者:ZhouZhaoxiong
  10. *完成日期:20160322
  11. *
  12. **********************************************************************/
  13. #include<stdio.h>
  14. #include<string.h>
  15. #include<stdlib.h>
  16. //重新定义数据类型
  17. typedefsignedcharINT8;
  18. typedefintINT32;
  19. typedefunsignedintUINT32;
  20. //函数声明
  21. voidGetLCSOfTwoStr(INT8*pszInputStr1,INT8*pszInputStr2);
  22. /**********************************************************************
  23. *功能描述:主函数
  24. *输入参数:无
  25. *输出参数:无
  26. *返回值:0-执行成功其它-执行失败
  27. *其它说明:无
  28. *修改日期版本号修改人修改内容
  29. *---------------------------------------------------------------------
  30. *20160322V1.0ZhouZhaoxiong创建
  31. ***********************************************************************/
  32. INT32main()
  33. {
  34. INT8szInputStr1[100]={0};
  35. INT8szInputStr2[100]={0};
  36. UINT32iPosFlag=0;
  37. printf("Pleaseinputstring1:\n");
  38. scanf("%s",szInputStr1);
  39. printf("InputStr1=%s\n",szInputStr1);
  40. printf("Pleaseinputstring2:\n");
  41. scanf("%s",szInputStr2);
  42. printf("InputStr2=%s\n",szInputStr2);
  43. //先判断是否有中文字符
  44. for(iPosFlag=0;iPosFlag<strlen(szInputStr1);iPosFlag++)
  45. {
  46. if(szInputStr1[iPosFlag]<0)//小于0则表示含有中文字符
  47. {
  48. printf("%shasChinesecharacter,pleasecheck!\n",szInputStr1);
  49. return-1;
  50. }
  51. }
  52. for(iPosFlag=0;iPosFlag<strlen(szInputStr2);iPosFlag++)
  53. {
  54. if(szInputStr2[iPosFlag]<0)//小于0则表示含有中文字符
  55. {
  56. printf("%shasChinesecharacter,pleasecheck!\n",szInputStr2);
  57. return-1;
  58. }
  59. }
  60. //再调用函数获取两个字符串的最长公共子串
  61. GetLCSOfTwoStr(szInputStr1,szInputStr2);
  62. return0;
  63. }
  64. /**********************************************************************
  65. *功能描述:获取两个字符串的最长公共子串
  66. *输入参数:pszInputStr1-输入字符串1
  67. pszInputStr2-输入字符串2
  68. *输出参数:无
  69. *返回值:无
  70. *其它说明:无
  71. *修改日期版本号修改人修改内容
  72. *---------------------------------------------------------------------
  73. *20160322V1.0ZhouZhaoxiong创建
  74. ***********************************************************************/
  75. voidGetLCSOfTwoStr(INT8*pszInputStr1,INT8*pszInputStr2)
  76. {
  77. UINT32iInnerLoopFlag=0;
  78. UINT32iOutterLoopFlag=0;
  79. UINT32iPosFlag=0;
  80. UINT32iLCSLen=0;
  81. INT32iStartPos=-1;
  82. INT8szLCS[100]={0};
  83. if(pszInputStr1==NULL||pszInputStr2==NULL)
  84. {
  85. return;
  86. }
  87. for(iOutterLoopFlag=0;iOutterLoopFlag<strlen(pszInputStr1);iOutterLoopFlag++)
  88. {
  89. for(iInnerLoopFlag=0;iInnerLoopFlag<strlen(pszInputStr2);iInnerLoopFlag++)
  90. {
  91. if(pszInputStr1[iOutterLoopFlag]==pszInputStr2[iInnerLoopFlag])
  92. {
  93. for(iPosFlag=1;pszInputStr1[iOutterLoopFlag+iPosFlag]!='\0';iPosFlag++)
  94. {
  95. if(pszInputStr1[iOutterLoopFlag+iPosFlag]!=pszInputStr2[iInnerLoopFlag+iPosFlag])//遇到不相等的字符,则退出比较
  96. {
  97. break;
  98. }
  99. }
  100. if(iLCSLen<iPosFlag)
  101. {
  102. iLCSLen=iPosFlag;
  103. iStartPos=iOutterLoopFlag;
  104. }
  105. }
  106. }
  107. }
  108. if(iStartPos==-1)
  109. {
  110. memset(szLCS,0x00,sizeof(szLCS));
  111. }
  112. else
  113. {
  114. memcpy(szLCS,&pszInputStr1[iStartPos],iLCSLen);
  115. }
  116. if(iLCSLen>0)
  117. {
  118. printf("%s和%s的最长公共子串是:%s,其长度是:%d\n",pszInputStr1,pszInputStr2,szLCS,iLCSLen);
  119. }
  120. else
  121. {
  122. printf("%s和%s无公共子串!\n",pszInputStr1,pszInputStr2);
  123. }
  124. }

五、程序测试

我们将编写好的程序“GetLCS.c”上传到Linux机器,并使用“gcc -g -o GetLCS GetLCS.c”命令对该程序进行编译,生成“GetLCS”文件。下面对程序进行详细的测试。

1.输入字符串1为“abcdef”,字符串2为“hijkabm”时,程序运行情况如下:

  1. Pleaseinputstring1:
  2. abcdef
  3. InputStr1=abcdef
  4. Pleaseinputstring2:
  5. hijkabm
  6. InputStr2=hijkabm
  7. abcdef和hijkabm的最长公共子串是:ab,其长度是:2

2.输入字符串1为“1234!@#”,字符串2为“5678!@#1”时,程序运行情况如下:

  1. Pleaseinputstring1:
  2. 1234!@#
  3. InputStr1=1234!@#
  4. Pleaseinputstring2:
  5. 5678!@#1
  6. InputStr2=5678!@#1
  7. 1234!@#和5678!@#1的最长公共子串是:!@#,其长度是:3

3.输入字符串1为“123你们好”,字符串2为“123”时,程序运行情况如下:

  1. Pleaseinputstring1:
  2. 123你们好
  3. InputStr1=123你们好
  4. Pleaseinputstring2:
  5. 123
  6. InputStr2=123
  7. 123你们好hasChinesecharacter,pleasecheck!

4.输入字符串1为“123abc”,字符串2为“abd ef”时,程序运行情况如下:

  1. Pleaseinputstring1:
  2. 123abc
  3. InputStr1=123abc
  4. Pleaseinputstring2:
  5. abdef
  6. InputStr2=abd
  7. 123abc和abd的最长公共子串是:ab,其长度是:2

5.输入字符串1为“abcdef”,字符串2为“123456”时,程序运行情况如下:

  1. Pleaseinputstring1:
  2. abcdef
  3. InputStr1=abcdef
  4. Pleaseinputstring2:
  5. 123456
  6. InputStr2=123456
  7. abcdef和123456无公共子串!

六、需求扩展

基于本文中的需求和程序,我们可考虑对需求进行以下扩展:

1.如果两个字符串有多于一个最长公共子串,则都要将它们输出,即如果字符串1为“1234abcd”,字符串2为“abd12”,那么程序输入的最长公共子串为“12”和“ab”。

2.不限制输入字符串中不能出现中文字符,即如果字符串1为“我们123”,字符串2为“我们”,那么最长公共子串为“我们”。

【本文是清一色专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】

戳这里,看该作者更多好文

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月7日 17:21
下一篇 2023年5月7日 17:21

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信