华为机试HJ75公共子串计算

华为机试HJ75公共子串计算

题目:

找到两个字符串中最长公共子串的长度。

想法:

动态规划的思想,因为两个字符串可以形成一个二维空间,计算对应位置上为到该位置为止最长的公共子串的长度,将最大长度输出。
动态规划要把握三个要点:边界、最优子结构和动态转移方程。
其中在没有比较子串之前有0个公共子串为边界,最优子结构是dp[i][j],动态转移方程为dp[i+1][j+1] = dp[i][j] + 1。

import sys

# 获取两个字符串
count = 1
s_1 = ""
s_2 = ""
for line in sys.stdin:
    a = line.split()
    if count == 1:
        s_1 = a[0]
    else:
        s_2 = a[0]
    count += 1

# 创建一个全零的矩阵
dp = [[0 for i in range(len(s_2)+1)] for j in range(len(s_1)+1)]

# 将计算得到的每个位置上的最大长度与当前最大长度比较,最终获得最大长度数值
max_len = 0
for i in range(len(s_1)):
    for j in range(len(s_2)):
        if s_1[i] == s_2[j]:
            dp[i+1][j+1] = dp[i][j] + 1
            if dp[i+1][j+1] > max_len:
                max_len = dp[i+1][j+1]

print(max_len)

你可能感兴趣的:(算法,动态规划,python)