【问题标题】:Need help creating a FindMaxOverlap function需要帮助创建 FindMaxOverlap 函数
【发布时间】:2013-04-14 13:02:36
【问题描述】:

我正在尝试创建一个函数,给定两个 C 字符串,它会返回两个字符串之间连续字符重叠的数量。

例如,

String 1: "Today is monday."
String 2: " is monday."

这里的重叠是“is monday.”,即 11 个字符(包括空格和 '.')。

【问题讨论】:

  • 所以给定2个字符串,找到序数交集
  • @KhaledAKhunaifer 给定两个刺,找出重叠的起点和长度。
  • 所以只有 1 个重叠?
  • 是的。保罗的回答有效,但对于边缘情况有点错误。

标签: c algorithm


【解决方案1】:

如果您需要更高效的方法,请考虑字符串 1 和 2 之间的部分不匹配意味着您可以沿字符串 1 跳跃字符串 2 其余部分的长度。这意味着您不需要搜索整个字符串 1 .

看看Boyer-Moore algorithm。虽然它用于字符串搜索,但您可以使用字符串 2 作为模式和字符串 1 作为目标文本来实现此算法来查找最大长度的子字符串。

【讨论】:

    【解决方案2】:

    可能有更有效的方法来做到这一点,但这里有一个简单的方法:

    #include <string.h>
    int main() {
    char s1[17] = "Today is monday.";
    char s2[12] = " is monday.";
    
    int max = 0;
    int i_max = -1;
    int j_max = -1;
    int i = 0, j = 0, k=0;
    int endl = 0, sl1, sl2;
    char *ss1, *ss2;
    
    for(i = 0; i < strlen(s1)-1; i++) {
        ss1 = s1+i;
        sl1 = strlen(ss1);
    
        if(max >= sl1) {
            break; // You found it.
        }
    
        for(j = 0; j < strlen(s2)-1; j++) {
            ss2 = s2+j;
            sl2 = strlen(ss2);
    
            if(max >= sl2) {
               break;    // Can't find a bigger overlap.
            }
            endl = (sl1 > sl2)?sl2:sl1;
    
            int n_char = 0;
            for(k = 0; k < endl+1; k++) {
                // printf("%s\t%s\n", ss1+k, ss2+k);   // Uncomment if you want to see what it compares.
                if(ss1[k] != ss2[k] || ss1[k] == '\0') {
                    n_char = k;
                    break;
                }
            }
    
            if(n_char > max) {
                max = n_char;
                i_max = i;
                j_max = j;
            }
        }
    }
    char nstr[max+1];
    nstr[max] = '\0';
    strncpy(nstr, s1+i_max, max);
    
    printf("Maximum overlap is %d characters, substring: %s\n", max, nstr);
    return 0;
    }
    

    更新:我已经修复了这些错误。这绝对可以编译。结果如下:http://codepad.org/SINhmm7f 问题是 endl 定义错误,我没有检查行尾条件。

    希望代码不言自明。

    【讨论】:

    • 嗨,保罗。我不确定这是否是我要找的。基本上,我只需要计算两个字符串之间的字符重叠数。
    • 嗯,我想这就是最里面的函数的作用。
    • 我已经编辑了我的,以便更清楚我提出的算法是如何工作的。
    • 嘿,你应该不接受这个答案。我刚刚意识到我对 strspn 感到困惑。它匹配整个 s2 集合中的任何字符。我想弄清楚我在想什么。
    • 好的,这似乎现在可以正常工作了。我不喜欢调试它,但这是一般的想法 - 数着数,直到你发现不同之处。
    【解决方案3】:

    这是我的解决方案,它会返回重叠起始点的位置,有点复杂,但在C中是这样完成的:

    #include <string.h>
    
    int FindOverlap (const char * a, const char * b)
    {
        // iterators
        char * u = a;
        char * v = b;
        char * c = 0; // overlap iterator
    
        char overlapee = 'b';
    
        if (strlen(a) < strlen(b)) overlapee = 'a';
    
        if (overlapee == 'b')
        {
            while (*u != '\0')
            {
                v = b; // reset b iterator
                c = u;
                while (*v != '\0')
                {
                    if (*c != *v) break;
                    c++;
                    v++;
                }
    
                if (*v == '\0') return (u-a); // return overlap starting point
            }
        }
        else if (overlapee == 'a')
        {
            while (*v != '\0')
            {
                u = a; // reset b iterator
                c = v;
                while (*u != '\0')
                {
                    if (*c != *u) break;
                    c++;
                    u++;
                }
    
                if (*v == '\0') return (v-b); // return overlap starting point
            }
        }
    
        return (-1); // not found
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2013-12-08
      • 2020-03-06
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      相关资源
      最近更新 更多