思路:该题求连个子串的公共长度,不要求子串一定连续。子串长度有两种情况,第一种,其中任意一个子串的长度为0,那公共长度就一定为0 第二种,就是子串长度不为0,在子串长度不为0 的情况下又有2种情况,子串长度相等,子串长度不相等。 可用穷举法求解或动态规划法求解。 设第一字符串为A,第二个字符串为B,公共子串为C,i为A的下标j为B的下标
可以得到下列公式:
当其中有一个子串长度为0时 i==0||j==0 c[i,j]=0;
当Ai==Bj时,跳过该字符,两个字符串当前位置同时后移,比较后面的字符 c[i,j]=c[i-1,j-1]+1;
当Ai!=Bj时,分两个情况讨论:
第一种情况:i的位置固定不动,遍历j,找到i对应的字符串中与当前位置相同的元素
第二种情况:遍历i,找到j对应的字符串中与当前位置相同的元素,j的位置固定不动
然后对这两种情况进行比较,得到最大值,存入用来存储子串的数组中 c[i,j]=Math.Max((c[i,j-1]),(c[i-1,j]))
得到所有元素之后,就需要以字符串的形式输出,因为是子串,所以子串中的值无论在哪一个字符串中都存在,当i,j对应的位置一样时,然后把需要的值赋给要输出的字符串,
若对应的位置不一样就根据数组C通过字符串找到子串中的元素,然后赋值给要输出的字符串。
--------------------------------------------------------------------------

本博客探讨如何找到两个非连续子序列的最大公共长度。思路包括穷举法和动态规划,通过比较不同情况来确定最长公共子序列。动态规划公式包括:当子串长度为0时,公共长度为0;当当前字符相同,长度加一;当字符不同时,取最大公共长度。
最低0.47元/天 解锁文章
1400

被折叠的 条评论
为什么被折叠?



