广西住房和城乡建设网站,深圳工业设计展2024,紧急大通知狼拿笔记好,企业网站建设讲解在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题#xff0c;但它有一定缺陷#xff0c;举个例子#xff0c;看下面的两个字符串我爱吃小青菜和各种鲜水果。我很爱吃青菜与各样水果。上面两个字符串#xff0c;如果通过计算子串来求相似度#xff0c;会发现…在前面我讲解了如何通过最长公共子串来求解两个文本的相似度问题但它有一定缺陷举个例子看下面的两个字符串我爱吃小青菜和各种鲜水果。我很爱吃青菜与各样水果。上面两个字符串如果通过计算子串来求相似度会发现相似度比较低但如果考虑用最长公共子序列算法求相似度问题则相似度会很高。子串是有序且连续的而子序列是有序但不一定连续。那么本文就来讲讲如何求两个字符串的最长公共子序列。一. 暴力解法跟求最长公共子串一样也可以用暴力方法来求解最长公共子序列问题但是复杂度会更高时间复杂度是指数级别的很显然这种方法行不通。二. 动态规划法假如两个字符串分别表示为X[x_0, x_1, ..., x_m-1]Y[y_0, y_1, ..., y_n-1]通过动态规划法求最长公共子序列那么用dp[i][j]来表示以x_i和y_j为结尾的最长公共子串的长度那么当x_iy_j时dp[i][j] dp[i - 1][j - 1] 1当x_i≠y_j时dp[i][j]为dp[i - 1][j]和dp[i][j - 1]中最大的那个所以得到其状态转移方程如下代码如下int LCS(string x, string y) { int xlen x.size(); int ylen y.size(); for (int i 0; i xlen; i) { for (int j 0; j ylen; j) { if (i 0 || j 0) { dp[i][j] 0; } else if (x[i - 1] y[j - 1]) { dp[i][j] dp[i - 1][j - 1] 1; } else { dp[i][j] max(dp[i - 1][j], dp[i][j - 1]); } } } return dp[xlen][ylen];}很明显基于动态规划法的最长公共子序列的时间复杂度为O(mn)。后面会讲解更多关于求解文本相似度问题的算法欢迎大家的关注