一、最长公共子序列
首先区别一下子串与子序列,子串要求是连续的而子序列不要求连续。例如ABCDEG字符串, ABC为子串,ADG为子序列。
设有两个字符串数组 str1【N】和str2【M】,构建二维数组DP【N】【M】,其中DP【i】【j】的含义:字符串str1【0……i】与str2【0……j】的公共子序列的长度。
我们来分析DP【i】【j】的来源,
1、首先DP【i】【j】的值不会小于DP【i-1】【j-1】,如果str1【i】==str2【j】,则DP【i】【j】 = DP【i-1】【j-1】+1。
2、如果str1【i】!= str2【j】,DP的来源于max( DP【i】【j-1】,DP【i-1】【j】),
此时不用考虑DP【i-1】【j-1】,因为:
DP【i】【j-1】>=DP【i-1】【j-1】,
DP【i-1】【j】>=DP【i-1】【j-1】
( 没看明白可以这样考虑:
str1【0……i】与str2【0……j-1】 的公共子序列肯定不会比str1【0……i-1】与str2【0……j-1】的公共子序列小,
同理str1【0……i-1】与str2【0……j】的公共子序列肯定不会比str1【0……i-1】与str2【0……j-1】的公共子序列小。)