改进LCS:
用k表示最长公共子串允许的最长间隔。
如(‘我喜欢周杰伦歌’,’我最喜欢的是周杰伦唱的歌哈’,)
如果k = 2: 匹配出 ‘我喜欢‘ or ’周杰伦’ ,因为‘欢的是周’ 中‘欢’与‘周’字间隔为3,超过k值。
如果k = 3: 匹配出 ‘我喜欢周杰伦歌’ 。
修改过的动态规划方法:
用str1,str2分别表示需要匹配的串。 用state[i][j]表示以str1[i],str[j]结尾的最长公共子串。
优化子结构: 要求整个序列的LCS,可以分解成所有子串间的LCS,取个最大值。所有子问题构建问题的解。
重叠子问题:
要求 state[i][j] ,如果str1[i]==str[j],这时候只要得到里i,j距离为k内的state的最大值,因为是满足固定距离的,所以新的 state[i][j] 为上述最大值加一。
只需要求 str1[i’],str2[j’]结尾的 state[i′][j′] 的最大值, i′∈[i−k,i−1],j′∈[j−k,j−1] , 重复求解了 state[i′][j′] ,子问题具有重复性。
状态转移方程:
if str1[i] == str[j]: state[i][j]=max(state[i′][j′])+1,i′∈[i−k,i−1],j′∈[j−k,j−1]
if str1[i] != str[j]: state[i][j]=0
最后返回state中的最大值。
- 时间复杂度 O(k2n2) ,空间复杂度 O(n2)