自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【字符串處理算法】獲取最長(zhǎng)公共子串的算法設(shè)計(jì)及C代碼實(shí)現(xiàn)

開(kāi)發(fā) 開(kāi)發(fā)工具 算法
今天講講獲取最長(zhǎng)公共子串的算法設(shè)計(jì)及C代碼實(shí)現(xiàn)的知識(shí)。

一、需求描述

輸入兩個(gè)字符串,編寫(xiě)程序獲取這兩個(gè)字符串的***個(gè)最長(zhǎng)公共子串。

例如,輸入的字符串為“abcdef”和“fecdba”,那么這兩個(gè)字符串的***個(gè)最長(zhǎng)公共子串為“cd”。

二、算法設(shè)計(jì)

我們可以首先尋找兩個(gè)字符串中的***個(gè)相等的字符,然后分別向后移動(dòng)來(lái)比較對(duì)應(yīng)位置的字符是否相等。

即如果字符串1為“1234abcd”,字符串2為“abd”,那么首先發(fā)現(xiàn)字符串1中的第五個(gè)字符“a”與字符串2中的***個(gè)字符“a”相等,接著字符串1中的第六個(gè)字符“b”與字符串2中的第二個(gè)字符“b”相等,再接著發(fā)現(xiàn)字符串1中的第七個(gè)字符“c”與字符串2中的第三個(gè)字符“d”不相等,此時(shí)比較結(jié)束。也就是說(shuō)字符串1和字符串2的最長(zhǎng)公共子串為“ab”。

算法

三、特殊流程考慮

在編寫(xiě)程序的過(guò)程中,我們要對(duì)輸入的字符串的長(zhǎng)度及格式多做考慮,如:

1.如果輸入的兩個(gè)字符串之一含有中文字符,那么程序直接返回而不執(zhí)行后續(xù)流程。

2.如果輸入的兩個(gè)字符串之一含有空格,那么程序獲取空格之前的字符串進(jìn)行后續(xù)操作。

 

四、程序代碼

  1. /********************************************************************** 
  2. * 版權(quán)所有 (C)2016, Zhou Zhaoxiong。 
  3. * 文件名稱: GetLCS.c 
  4. * 文件標(biāo)識(shí): 無(wú) 
  5. * 內(nèi)容摘要: 尋找兩個(gè)字符串的最長(zhǎng)公共子串 
  6. * 其它說(shuō)明: 例如, "abcdef"和"bcf"的最長(zhǎng)公共子串是"bc" 
  7. * 當(dāng)前版本: V1.0 
  8. * 作    者: Zhou Zhaoxiong 
  9. * 完成日期: 20160322 
  10. **********************************************************************/ 
  11. #include <stdio.h> 
  12. #include <string.h> 
  13. #include <stdlib.h> 
  14.  
  15.  
  16. // 重新定義數(shù)據(jù)類型 
  17. typedef signed   char  INT8; 
  18. typedef          int   INT32; 
  19. typedef unsigned int   UINT32; 
  20.  
  21. // 函數(shù)聲明 
  22. void GetLCSOfTwoStr(INT8 *pszInputStr1, INT8 *pszInputStr2); 
  23.  
  24.  
  25. /********************************************************************** 
  26. * 功能描述: 主函數(shù) 
  27. * 輸入?yún)?shù): 無(wú) 
  28. * 輸出參數(shù): 無(wú) 
  29. * 返 回 值: 0-執(zhí)行成功   其它-執(zhí)行失敗 
  30. * 其它說(shuō)明: 無(wú) 
  31. * 修改日期        版本號(hào)     修改人            修改內(nèi)容 
  32. * --------------------------------------------------------------------- 
  33. * 20160322        V1.0     Zhou Zhaoxiong        創(chuàng)建 
  34. ***********************************************************************/ 
  35. INT32 main() 
  36.     INT8   szInputStr1[100] = {0}; 
  37.     INT8   szInputStr2[100] = {0}; 
  38.     UINT32 iPosFlag        = 0
  39.      
  40.     printf("Please input string1: \n"); 
  41.     scanf("%s", szInputStr1); 
  42.     printf("InputStr1=%s\n", szInputStr1); 
  43.  
  44.     printf("Please input string2: \n"); 
  45.     scanf("%s", szInputStr2); 
  46.     printf("InputStr2=%s\n", szInputStr2); 
  47.  
  48.     // 先判斷是否有中文字符 
  49.     for (iPosFlag = 0; iPosFlag < strlen(szInputStr1); iPosFlag ++) 
  50.     { 
  51.         if (szInputStr1[iPosFlag] < 0)     // 小于0則表示含有中文字符 
  52.         { 
  53.             printf("%s has Chinese character, please check!\n", szInputStr1); 
  54.             return -1; 
  55.         } 
  56.     } 
  57.  
  58.     for (iPosFlag = 0; iPosFlag < strlen(szInputStr2); iPosFlag ++) 
  59.     { 
  60.         if (szInputStr2[iPosFlag] < 0)     // 小于0則表示含有中文字符 
  61.         { 
  62.             printf("%s has Chinese character, please check!\n", szInputStr2); 
  63.             return -1; 
  64.         } 
  65.     } 
  66.  
  67.     // 再調(diào)用函數(shù)獲取兩個(gè)字符串的最長(zhǎng)公共子串 
  68.     GetLCSOfTwoStr(szInputStr1, szInputStr2); 
  69.  
  70.     return 0; 
  71.  
  72.  
  73. /********************************************************************** 
  74. * 功能描述: 獲取兩個(gè)字符串的最長(zhǎng)公共子串 
  75. * 輸入?yún)?shù): pszInputStr1-輸入字符串1 
  76.              pszInputStr2-輸入字符串2 
  77. * 輸出參數(shù): 無(wú) 
  78. * 返 回 值: 無(wú) 
  79. * 其它說(shuō)明: 無(wú) 
  80. * 修改日期        版本號(hào)     修改人            修改內(nèi)容 
  81. * --------------------------------------------------------------------- 
  82. * 20160322        V1.0     Zhou Zhaoxiong        創(chuàng)建 
  83. ***********************************************************************/ 
  84. void GetLCSOfTwoStr(INT8 *pszInputStr1, INT8 *pszInputStr2) 
  85.     UINT32 iInnerLoopFlag  = 0
  86.     UINT32 iOutterLoopFlag = 0
  87.     UINT32 iPosFlag        = 0
  88.     UINT32 iLCSLen         = 0;  
  89.     INT32  iStartPos       = -1; 
  90.     INT8   szLCS[100]      = {0}; 
  91.      
  92.     if (pszInputStr1 == NULL || pszInputStr2 == NULL) 
  93.     { 
  94.         return; 
  95.     } 
  96.  
  97.     for (iOutterLoopFlag = 0; iOutterLoopFlag < strlen(pszInputStr1); iOutterLoopFlag ++) 
  98.     {  
  99.         for (iInnerLoopFlag = 0; iInnerLoopFlag < strlen(pszInputStr2); iInnerLoopFlag ++) 
  100.         {  
  101.             if (pszInputStr1[iOutterLoopFlag] == pszInputStr2[iInnerLoopFlag]) 
  102.             {  
  103.                 for (iPosFlag = 1; pszInputStr1[iOutterLoopFlag+iPosFlag] != '\0'; iPosFlag ++) 
  104.                 { 
  105.                     if (pszInputStr1[iOutterLoopFlag+iPosFlag] != pszInputStr2[iInnerLoopFlag+iPosFlag]) // 遇到不相等的字符, 則退出比較 
  106.                     { 
  107.                         break; 
  108.                     } 
  109.                 } 
  110.  
  111.                 if (iLCSLen < iPosFlag
  112.                 {  
  113.                     iLCSLen   = iPosFlag;  
  114.                     iStartPos = iOutterLoopFlag;  
  115.                 }  
  116.             }  
  117.         }  
  118.     }  
  119.    
  120.     if (iStartPos == -1) 
  121.     {  
  122.         memset(szLCS, 0x00, sizeof(szLCS));  
  123.     } 
  124.     else 
  125.     {  
  126.         memcpy(szLCS, &pszInputStr1[iStartPos], iLCSLen);  
  127.     }  
  128.  
  129.     if (iLCSLen > 0) 
  130.     { 
  131.         printf("%s和%s的最長(zhǎng)公共子串是:%s, 其長(zhǎng)度是:%d\n", pszInputStr1, pszInputStr2, szLCS, iLCSLen); 
  132.     } 
  133.     else 
  134.     { 
  135.         printf("%s和%s無(wú)公共子串!\n", pszInputStr1, pszInputStr2); 
  136.     }   

五、程序測(cè)試

我們將編寫(xiě)好的程序“GetLCS.c”上傳到Linux機(jī)器,并使用“gcc -g -o GetLCS GetLCS.c”命令對(duì)該程序進(jìn)行編譯,生成“GetLCS”文件。下面對(duì)程序進(jìn)行詳細(xì)的測(cè)試。

1.輸入字符串1為“abcdef”,字符串2為“hijkabm”時(shí),程序運(yùn)行情況如下:

  1. Please input string1: 
  2. abcdef 
  3. InputStr1=abcdef 
  4. Please input string2: 
  5. hijkabm 
  6. InputStr2=hijkabm 
  7. abcdef和hijkabm的最長(zhǎng)公共子串是:ab, 其長(zhǎng)度是:2 

2.輸入字符串1為“1234!@#”,字符串2為“5678!@#1”時(shí),程序運(yùn)行情況如下:

  1. Please input string1: 
  2. 1234!@# 
  3. InputStr1=1234!@# 
  4. Please input string2: 
  5. 5678!@#1 
  6. InputStr2=5678!@#1 
  7. 1234!@#和5678!@#1的最長(zhǎng)公共子串是:!@#, 其長(zhǎng)度是:3 

3.輸入字符串1為“123你們好”,字符串2為“123”時(shí),程序運(yùn)行情況如下:

  1. Please input string1: 
  2. 123你們好 
  3. InputStr1=123你們好 
  4. Please input string2: 
  5. 123 
  6. InputStr2=123 
  7. 123你們好 has Chinese character, pleasecheck! 

4.輸入字符串1為“123abc”,字符串2為“abd ef”時(shí),程序運(yùn)行情況如下:

  1. Please input string1: 
  2. 123abc 
  3. InputStr1=123abc 
  4. Please input string2: 
  5. abd ef 
  6. InputStr2=abd 
  7. 123abc和abd的最長(zhǎng)公共子串是:ab, 其長(zhǎng)度是:2 

5.輸入字符串1為“abcdef”,字符串2為“123456”時(shí),程序運(yùn)行情況如下:

  1. Please input string1: 
  2. abcdef 
  3. InputStr1=abcdef 
  4. Please input string2: 
  5. 123456 
  6. InputStr2=123456 
  7. abcdef和123456無(wú)公共子串! 

六、需求擴(kuò)展

基于本文中的需求和程序,我們可考慮對(duì)需求進(jìn)行以下擴(kuò)展:

1.如果兩個(gè)字符串有多于一個(gè)最長(zhǎng)公共子串,則都要將它們輸出,即如果字符串1為“1234abcd”,字符串2為“abd12”,那么程序輸入的最長(zhǎng)公共子串為“12”和“ab”。

 

2.不限制輸入字符串中不能出現(xiàn)中文字符,即如果字符串1為“我們123”,字符串2為“我們”,那么最長(zhǎng)公共子串為“我們”。

【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號(hào):周氏邏輯(logiczhou)】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2016-12-30 13:32:24

字符串算法代碼

2016-12-29 17:07:59

字符算法代碼

2016-12-30 13:16:51

字符串算法代碼

2016-12-29 17:14:41

回文串算法代碼

2016-12-30 13:37:50

字符串算法代碼

2023-02-26 22:33:32

字符串排列算法

2009-08-11 10:26:49

C#算法C#字符串反轉(zhuǎn)

2016-12-29 16:25:32

字符串算法代碼

2021-09-02 09:22:13

算法無(wú)重復(fù)字符

2013-05-06 10:54:08

字符串字符串匹配KMP算法

2023-12-15 10:27:01

暴力匹配算法Python字符串

2021-09-03 09:41:36

字符串時(shí)間復(fù)雜度

2021-11-12 09:44:03

字符串算法復(fù)雜度

2023-04-11 08:54:57

字符串匹配算法

2013-05-06 10:49:21

Boyer-Moore算法字符串匹配

2021-09-10 08:31:54

翻轉(zhuǎn)字符串單詞

2021-11-19 09:00:24

LeetCode字符串算法

2021-12-17 08:51:41

LeetCode最長(zhǎng)公共前綴算法

2021-11-15 07:47:40

字符串位置存儲(chǔ)

2010-11-26 09:51:54

MySQL字符串
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)