|
发表于 2020-4-15 15:42:21
|
显示全部楼层
本帖最后由 TJBEST 于 2020-4-15 21:14 编辑
采用了一种算法,因为本人不太精通算法,不知道有没有成套的系统
我通过数学的数组递归得出的结论
f(i,j)表示从word1取前i元素构成字符串str1,word2取前j元素构成字符串str2时,可以从str1和str2中找到相同的子列的长度的最大值。(子列定义为:从字符串中选择若干字符并将他们按照在原有字符串的顺序拼接在一起组成的新字符串)
当word1[i-1]==word2[j-1] 显然为f(i,j)=f(i-1,j-1)+1
当word1[i-1]!=word2[j-1] 可知f(i-1,j)和f(i,j-1)至少有一个和f(i,j)相等且根据定义可知 f(i-m,j-n)<= f(i,j)(m,n都是非负数)存在。所以f(i,j)=min{f(i-1,j),f(i,j-1)}
最后的结果两个字符串总长度 减去 两倍保留的长度(保留的长度即f(len(word1),len(word2),删完剩下的字符串长度)
上面的推导不是三言两语说明白的,语言能力有限
- def fun376(word1,word2):
- M1 = len(word1)
- M2 = len(word2)
- previous = [0]*(M2+1)
- for i in range(1,M1+1):
- now = [0]
- for j in range(1,M2+1):
- if word1[i-1]==word2[j-1]:
- now.append(previous[j]+1)
- else:
- now.append(max(previous[j],now[-1]))
- previous = now[:]
- return M1+M2-previous[-1]*2
复制代码 |
评分
-
查看全部评分
|