2011-05-17 64 views
1
int overlap(const char *s1, const char *s2){ 
    int i = 0; 
    while (s1[i] && s2[i] && s1[i] == s2[i]) 
     i++; 
    return i; 
} 

這將返回兩個字符串之間的子字符串重疊長度作爲輸入。但是,如果兩個字符串:檢測兩個字符串之間重疊的長度

abcdefg 
1234efg 

則返回0重疊,因爲它只能讀取開始在字符串的開始重疊,有人可以修改或幫我做,以便它可以讀取重疊沒有mantter他們在字符串中?

+1

這是不小的修改。在這種情況下應該輸出什麼程序? s1 = abcdefgh,s2 = 1bc45fgh - 2或3或5? – 2011-05-17 05:18:30

+2

你必須首先定義你的函數做什麼。我發現你想要的和你的代碼中有什麼不一致。 – shinkou 2011-05-17 05:21:15

+0

'abcdef'和'abcef'怎麼樣? – 2011-05-17 05:27:21

回答

0

嗯,我再次想到了這個問題。 我想你想在每個字符串中的相同索引重疊。 注意每個字符串末尾的字符'\ 0'。

,所以我們可以寫代碼如下所示:

int overlap(const char *s1, const char *s2){ 
    int i = 0; 
    while (*s1 != '\0' && *s2 != '\0') { 
     if (*s1++ == *s2++) i++; 
    } 
    return i; 
} 

爲 「ABCDEFG」 和 「1234efg」,它將返回3.

0

看起來有點像功課給我,是嗎?

您好while子句一旦發現字符串之間的差異就立即退出。你將不得不遍歷整個字符串,並且如果s1[i] == s2[i]對於每個索引i都計數。

0

假設你想同樣的指數在該重疊在每個字符串,如你的例子:

int overlap(const char *s1, const char *s2){ 
    int length = 0; 
    int i = 0; 
    while (s1[i] && s2[i] && s1[i] != s2[i]) 
     i++; 
    while (s1[i] && s2[i] && s1[i] == s2[i]) { 
     i++; 
     length++; 
    } 
    return length; 
} 

會做的伎倆,雖然它不是很優雅。它會在相同的偏移量處找到第一個重疊的長度。

所以對於abcdefgh901234efg890它將返回3.

如果你想匹配的字符總數然後嘗試:

int overlap(const char *s1, const char *s2){ 
    int length = 0; 
    int i = 0; 
    while (s1[i] && s2[i]) { 
     if (s1[i] == s2[i]) { 
      length++; 
     } 
     i++; 
    } 
    return length; 
} 
1

我認爲代碼將是這樣的:

int overlap(const char *s1, const char *s2){ 
    int i = 0, n = 0; 
    while (s1[i] && s2[i]) { 
     if (s1[i++] == s2[i++]) n++; 
    } 
    return n; 
} 
+2

有兩個i ++ ... – calandoa 2011-05-17 12:56:02

3

完成此操作的簡單方法是爲兩個字符串構建後綴樹(這是使用McCreght完成的)。現在只需在兩個字符串中查找具有原點的最長公共子字符串。

+0

這可能是最合理的表現,但蠻力無疑更容易(約25行off-我認爲他的問題域(200字符串,每個50個字符,這裏提到:http://stackoverflow.com/questions/6025939/help-with-this-ragged- array-substring-program-in-c),蠻力的表現可能不成問題。 – 2011-05-17 07:51:47

+0

@MichaelBurr問題是如果字符串對齊,如果不是,我不認爲有一個更優雅的方式,那麼suffixtree。 – 2011-05-17 09:54:00

+1

前綴表或邊界表(c.cf Crochemore「字符串算法」)可能會比後綴樹簡單得多。 – 2012-11-05 12:39:55

0
int overlap(const char *s1, const char *s2){ 
    int k; 
    for(k = 0; s1[k] != s2[k]; k++) // <--- add this loop 
     if(0 == s1[k] || 0 == s2[k]) 
     return 0; 
    int i = k;  // initialize to k + 1 
    while (s1[i] && s1[i] == s2[i]) // check only s1 (or s2) 
     i++; 
    return i - k; // return difference 
} 
相關問題