Advertisement

动态规划用于解决子串相关的问题

阅读量:

【最长公共子串问题的求解方法
为找出两个字符串之间的最长公共子串,可借助动态规划算法进行处理。
我们引入一个二维数组dp[i][j],用于记录第一个字符串的前i个字符与第二个字符串的前j个字符所构成的最长公共子串的长度。在初始化阶段,需要设定该数组的边界条件。显然,当i=0或j=0时,dp[i][j] = 0。然而,这一设定并不适用于实际计算过程,因为真正的起点应从两个字符串的第一个字符开始比较。若s1[i-1]与s2[0]相等,则dp[i][1] = 1;否则为0,这才是正确的初始条件。此时的时间复杂度为O(n1)。接着固定第一行并逐列遍历,时间复杂度则为O(n2)。

接下来是递推公式的构建。为了确定dp[i][j]的值,即s1前i个字符与s2前j个字符的最大公共子串长度,需判断s1[i-1]和s2[j-1]是否相等。若相等,则dp[i][j] = dp[i-1][j-1] + 1;否则dp[i][j] = 0。同时设计一个临时变量maxLen用于记录当前最大的dp[i][j]值。为了获取具体的最长公共子串内容,则需设置另一个临时变量保存此时对应的i或j的位置,并从i-1-dp[i][j]+1到i-1的位置对s1进行截取即可。

暴力法在时间复杂度上存在明显劣势.
在处理两个字符串时,寻找其最长公共子串的方法通常采用固定其中一个字符串,并对另一个

全部评论 (0)

还没有任何评论哟~