BM65 最长公共子序列(二)动态规划

BM65动态规划专项牛客链接

问题描述:

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列

思路分析:

初读题目首先要解决的问题是区分子串和子序列:

1.子串:对于一个字符串变量,例如"adereegfbw",它的子串就是像"ader"这样可以从中找到的连续的字符串。字符串"adereegfbw"本身也属于它本身最长的子串。

2子序列:一个字符串的子序列是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

解决了这个问题,我们需要思考该问题的子问题是什么?

BM65 最长公共子序列(二)动态规划_第1张图片

通过我们对测试用例的模拟我们发现两个字符串如果同时从末尾位置开始比较会有以下两种情况:

1.该位置上两个字符串的字符相同,如果是这种情况的话我们不难发现,该字符一定是他们最长公共子序列的字符而且是已发现的公共子序列的前一个位置的字符;

2.该位置上两个字符串的字符不相同,如果是这种情况我们就需要判断如何进行取舍?是应该放弃第一个字符串的当前位置字符还是第二个字符串的,由于我们所求的是两个字符串的最长公共子序列,所以我们取舍的依据一定是要使其公共

你可能感兴趣的:(数据结构,java,动态规划)