【字串操作】 尋找兩個字串中的 最大公共子串
阿新 • • 發佈:2019-02-03
*題目描述:
請編寫一個函式,求2個字串的最長公共子串,n<20,字元長度不超過255.
例如有2個字串為:
Name some local bus.
local bus is high speed I/O bus close to the processor.
則最長的公共子串為“local bus”。
*要求實現的函式:
n :輸入的字串個數,即陣列中元素個數
【返回】動態分配的最長公共子串
【注意】只需完成該函式功能演算法,中間不需要任何IO輸入輸出
*示例
輸入: pIn[0] "what is local bus?"
pIn[1] "Name some local bus."
請編寫一個函式,求2個字串的最長公共子串,n<20,字元長度不超過255.
例如有2個字串為:
Name some local bus.
local bus is high speed I/O bus close to the processor.
則最長的公共子串為“local bus”。
*要求實現的函式:
void find(char* sp, char*dp, char* max_str)
【輸入】pIn:輸入的字串n :輸入的字串個數,即陣列中元素個數
【返回】動態分配的最長公共子串
【注意】只需完成該函式功能演算法,中間不需要任何IO輸入輸出
*示例
輸入: pIn[0] "what is local bus?"
pIn[1] "Name some local bus."
實現程式碼如下:
#include<stdio.h> #include<string.h> void find(char* sp, char*dp, char* max_str) { int s_len = strlen(sp); int d_len = strlen(dp); int i=0, j=0,k=0; int max_len = -1, tmp_max_len=0; int pian_yi_wei = 0; for(i; i<s_len; i++) { for(j=0; j<d_len; j++) { if(sp[i] == dp[j]) { for(k=0; (sp[i+k] == dp[j+k] && sp[i+k]!='\0' && dp[j+k] != '\0'); k++); if(k > max_len) { max_len = k; pian_yi_wei = i; } } } } if(max_len == -1) { max_str[0] = '\0'; } else { memcpy(max_str, sp+pian_yi_wei, max_len); max_str[max_len] = '\0'; } return ; } int main() { char str[30]={'\0'}; find("what is local bus?", "Name some local bus.", str); printf("max_str=%s\n", str); return 0; }
解題思路:
定位一個 遊標 ,記錄下當前的偏移量 ,也就是 上面 的pianyiwei,
假設k 為最大的長度, 再找到字元相同的時候,逐次 向後偏移,記錄最大值, 如果 多個相同最大子串 則保留最開始的。