字串相關演算法 編輯距離,最大公共字串 C 實現版

2021-09-08 02:02:10 字數 2180 閱讀 3730

1. levenshtein distance

該演算法又稱之為 "編輯距離",用於計算兩個字串的相似程度。原理很簡單,就是返回將第乙個字串轉換(刪除、插入、替換)成第二個字串的編輯次數。次數越少,意味著字串相似度越高。

演算法原理:wikipedia - levenshtein distance

本文摘自:

step1:

人 民 共 和 時 代

0, 0, 0, 0, 0, 0, 0

中 1, 0, 0, 0, 0, 0, 0

華 2, 0, 0, 0, 0, 0, 0

人 3, 0, 0, 0, 0, 0, 0

民 4, 0, 0, 0, 0, 0, 0

共 5, 0, 0, 0, 0, 0, 0

和 6, 0, 0, 0, 0, 0, 0

國 7, 0, 0, 0, 0, 0, 0

step2:

人 民 共 和 時 代

0, 1, 2, 3, 4, 5, 6

中 1, 0, 0, 0, 0, 0, 0

華 2, 0, 0, 0, 0, 0, 0

人 3, 0, 0, 0, 0, 0, 0

民 4, 0, 0, 0, 0, 0, 0

共 5, 0, 0, 0, 0, 0, 0

和 6, 0, 0, 0, 0, 0, 0

國 7, 0, 0, 0, 0, 0, 0

step3:

人 民 共 和 時 代

0, 1, 2, 3, 4, 5, 6

中 1, 1, 2, 3, 4, 5, 6

華 2, 2, 2, 3, 4, 5, 6

人 3, 2, 3, 3, 4, 5, 6

民 4, 3, 2, 3, 4, 5, 6

共 5, 4, 3, 2, 3, 4, 5

和 6, 5, 4, 3, 2, 3, 4

國 7, 6, 5, 4, 3, 3,4

演算法實現:

public static int levenshteindistance(string s1, string s2)

}

return d[m - 1, n - 1];

}

2. lcs

lcs (longest common subsequence) 演算法用於找出兩個字串最長公共子串。

演算法原理:

(1) 將兩個字串分別以行和列組成矩陣。

(2) 計算每個節點行列字元是否相同,如相同則為 1。

(3) 通過找出值為 1 的最長對角線即可得到最長公共子串。

人 民 共 和 時 代

中 0, 0, 0, 0, 0, 0

華 0, 0, 0, 0, 0, 0

1, 0, 0, 0, 0, 0

民 0,1, 0, 0, 0, 0

共 0, 0,1, 0, 0, 0

和 0, 0, 0,1, 0, 0

國 0, 0, 0, 0, 0, 0

為進一步提公升該演算法,我們可以將字元相同節點(1)的值加上左上角(d[i-1, j-1])的值,這樣即可獲得最大公用子串的長度。如此一來只需以行號和最大值為條件即可擷取最大子串。

人 民 共 和 時 代

中 0, 0, 0, 0, 0, 0

華 0, 0, 0, 0, 0, 0

1, 0, 0, 0, 0, 0

民 0,2, 0, 0, 0, 0

共 0, 0,3, 0, 0, 0

和 0, 0, 0,4, 0, 0

國 0, 0, 0, 0, 0, 0

演算法實現:

public static string lcs(string s1, string s2)

}

}

return s1.substring(index - length + 1, length);

}

最大公共字串

簡單dp問題 設兩個字串s1,s2,假設dp i j 代表到s1的第i個字元及s2的第j個字元時,最大公共字串的數目 那麼 if s1 i s2 j dp i j d i 1 j 1 1 else dp i j 0 如下 dp二維陣列空間是可以優化的,可以變成一位陣列.dp是個二維矩陣,舉例如下 a...

最大公共字串

最簡單的方法就是依次比較,以某個串為母串,然後生成另乙個串的所有長度的子串,依次去母串中比較查詢,這裡可以採用先從最長的子串開始,減少比較次數,但是複雜度依然很高!然後重新看一下這個問題,我們建立乙個比較矩陣來比較兩個字串str1和str2 定義lcs i,j 當str1 i str2 j 時lcs...

最大公共字串

a i 1 j 1 1最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的...