检测两个字符串之间的重叠长度

时间:2011-05-17 05:10:49

标签: c string overlap

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它们在字符串中吗?

6 个答案:

答案 0 :(得分:3)

这样做的简单方法是为两个字符串构建后缀树(这是使用McCreght完成的)。现在只需要在两个字符串中查找带有origin的longests公共子字符串。

答案 1 :(得分: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 :(得分:0)

看起来有点像家庭作业,是吗?

一旦发现字符串之间的差异,您while子句就会退出。您将不得不遍历整个字符串,并且对于每个索引i,如果s1[i] == s2[i]计算它。

答案 3 :(得分: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;
}

答案 4 :(得分: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.

答案 5 :(得分: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
}