修改最长的公共子串

时间:2013-12-13 10:47:54

标签: string algorithm

给定两个字符串什么是有效的算法来查找最长公共子字符串的数量和长度,子字符串在以下情况下被称为公共子字符:
1)它们具有至少x%字符相同且位于相同位置。
2)子串的起始和结束索引相同。

例如:
字符串1 - > abedefkhj
字符串2 - > kbfdfjhlo

假设被问到的x%是40,那么,ans是,

5 1
其中5是最长的长度,1是满足给定属性的每个字符串中的子串的数量。子串在字符串1中是“abede”,在字符串2中是“kbfdf”。

1 个答案:

答案 0 :(得分:1)

您可以使用Levenshtein distance之类的smth而不删除和插入。

构建表,其中每个元素[i,j]都是从位置[i]到位置[j]的子串的错误。

foo(string a, string b, int x):
    len = min(a.length, b.length)
    error[0][0] = 0 if a[0] == b[0] else 1;
    for (end: [1 -> len-1]):
        for (start: [end -> 0]):
            if a[end] == b[end]:
                error[start][end] = error[start][end - 1]
            else:
                error[start][end] = error[start][end - 1] + 1
    best_len = 0;
    best_pos = 0;
    for (i: [0 -> len-1]):
        for (j: [i -> 0]):
            len = i - j + 1
            error_percent = 100 * error[i][j] / len
            if (error_percent <= x and len > best_len):
                best_len = len
                best_pos = j
   return (best_len, best_pos)