设计最长公共子序列问题的动态规划算法 要求: 随机生成一个一万个字符的字符串s1的数据文件Character.txt。发出k(k=100)个随机数整数[0,9999]下标,给这k个字符随机赋值,形成第二个一万个字符的字符串s2。求这两个字符串的LCS,并计算重复率=Length(LCS)/Length(s1)。
时间: 2024-03-18 07:41:55 浏览: 50
最长公共子序列问题可以使用动态规划算法求解。具体算法步骤如下:
1. 定义状态:令dp[i][j]表示s1前i个字符和s2前j个字符的LCS长度。
2. 初始化状态:dp[0][j]和dp[i][0]均为0,其中0<=i<=len(s1), 0<=j<=len(s2)。
3. 状态转移:若s1[i]==s2[j],则dp[i][j]=dp[i-1][j-1]+1;否则dp[i][j]=max(dp[i-1][j],dp[i][j-1])。
4. 最终结果:dp[len(s1)][len(s2)]即为s1和s2的LCS长度。
代码实现如下:
```python
def LCS(s1, s2):
m, n = len(s1), len(s2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if s1[i - 1] == s2[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[m][n]
# 读取数据
with open('Character.txt', 'r', encoding='utf-8') as f:
s1 = f.read()
# 生成随机数
import random
k = 100
indices = random.sample(range(len(s1)), k)
# 修改s1中的字符
s2 = list(s1)
for idx in indices:
s2[idx] = chr(random.randint(0, 127))
s2 = ''.join(s2)
# 计算LCS和重复率
lcs_len = LCS(s1, s2)
repeat_rate = lcs_len / len(s1)
print('LCS长度为:', lcs_len)
print('重复率为:', repeat_rate)
```
需要注意的是,在实现中,为了方便,将字符用ASCII码表示,因此可能存在一些不可见字符。如果需要可视化输出LCS,可以将LCS的长度和最长公共子序列本身一并返回。
阅读全文