「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
这是一道动态规划题,蓝桥杯将这题出在了填空题上,但是只要对动态规划熟悉,做过这类题目,做起来还是很简单的。
题目
题目就是补全能够找到两串字符串的最大子串的程序。这段程序代码如下:
思路
我们入门应该都做过最长公共子序列,首先让我们回想一下我们自己做最大公共子序列是怎么做的,我们是用表格法,取第一串字符串作为比较字符串,先从它的第一个字符开始,与另一串字符串从它的第一个字符到最后一个字符,如果他们相同,那么这里的子串最长长度就为1,再从第一串字符串的第二个字符开始,还是与另一串字符串从它的第一个字符到最后一个字符,如果他们相同,那么就观察在表格中,这个位子的子串最长长度就为这个位子往左再往上这个位子的子串最长长度加一。如果他们不同,这个位子的最长公共子串长度就为这个位子往左的位子的子串最长长度或者是这个位子往上的位子的的子串最长长度,二者之间取最长的那个即可。
现在题目是让我们做最长公共子串,这个跟最大公共子序列可不一样,最大公共子序列中的子串是可以不连续的,而这里的最长公共子串是必须要连续的。其实我们做法也可以跟最大公共子序列一样,只不过需要修改一下。当我们在字符串中开始比较时,我们做法是只有第一条字符串中选取的字符的上一个字符跟第二条字符串中选取的字符的上一个字符相等时,在表格中这个位子的表示的长度就是这个位子的往左再往上的位子表示的长度再加一,就只有这一个操作,其他的操作都不需要了,这样就是为了选取是连续的公共子串。
现在再看题目,就可以填上这个答案:a[i-1][j-1]+1;
答案
a[i][j]=a[i-1][j-1]+1;