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它们在字符串中吗?
答案 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;
}
会做到这一点,虽然不是很优雅。它将在相同的偏移处找到第一个重叠的长度。
因此,对于abcdefgh90
和1234efg890
,它将返回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)
所以我们可以编写如下代码:
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
}