を解決するために、動的プログラミングを使用する必要があります
ここには簡単なブルートフォースがあります。 iとjの可能なすべてのペアの長さを計算します。複雑さはO(n1.length * n2)です。長さ*分(n1.length、n2.length))。両方の文字列の長さがnの場合、これはO(n )です。ここで
for (i = 0; i < n1.length; i++)
{
for (j = 0; j < n2.length; j++)
{
errors = 0
len = 0
while (errors <= k && i+len < n1.length && j+len < n2.length)
{
if (n1[i+len] != n2[j+len]) errors++
if (errors <= k) len++
}
if (len > best) update best
}
}
その後、正確にk個のエラーでそれを維持(に沿って部分文字列をシフトし、その時にk個のエラーが発生して部分文字列を設定しますが、オフセット、iとjの間のすべての可能なオフセットを通過し、より効率的なソリューションです)、各点の長さを観察する。複雑さはO((n1.length + n2.length)* min(n1.length、n2.length))です。両方の文字列の長さがnの場合、これはO(n )です。
for (offset = -n1.length; offset < n2.length; offset++)
{
// j is equal to (i + offset)
start = (offset > 0) ? 0 : -offset
stop = min(n1.length, n2.length - offset)
errors = 0
e = start // e is one past the end of the sequence, so l = e - i
for (i = start; i < stop; i++)
{
// move the end of the substring to maintain exactly k errors
while (e < stop && (errors < k || n1[e] == n2[e+offset]))
{
if (n1[e] != n2[e+offset]) errors++
e++
}
if (e - i > best) update best
if (n1[i] != n2[i+offset]) errors--
}
}
出典
2012-02-21 10:38:30
tom
私が正しく理解していれば、おおよその文字列マッチング(http://en.wikipedia.org/wiki/Approximate_string_matching参照)の変形であるようです。 –
おそらく、おおよその文字列の一致と、最も長い共通部分文字列の検索の組み合わせ:http://en.wikipedia.org/wiki/Longest_common_substring_problem –
hackerrankから:https://www.hackerrank.com/challenges/substring-diff –