如果只有兩個字符串,可以先建一個二維數組(實際上用不到二維數組,下面再詳細說),如input和reputation,如下:
i n p u t
r 0 0 0 0 0
e 0 0 0 0 0
p 0 0 1 0 0
u 0 0 0 2 0
t 0 0 0 0 3
a 0 0 0 0 0
t 0 0 0 0 1
i 1 0 0 0 0
o 0 0 0 0 0
n 0 1 0 0 0
其中的數字含義如下,0表示相應行和列的字符不相等,不是零就表示從這個字符開始,前n個字符是相同的,n就是那個數。比如第5列,第5行是3,表示input和reputation都有put這個子串。這些數裏邊有一個最大的,找出來就是了。
所以可以看出,對於兩個字符串的問題,如果你不是想把所有的最長公共子串都找出來的話,可以逐行逐列地計算,只要在計算過程中保留最大值就可以了。
怎麼"逐行逐列"地計算呢?可以先算第一行第一列,然後每一行每一列都通過上一行上一列算出。如果兩個字符不相等,就爲零。如果相等,就是左上角的數+1。因此算出了下一行和下一列,上一行和上一列就可以不要了。因爲我們縱保存最大值,和產生最大值的位置。所謂動態規劃,就是你算出下一行下一列,上一行上一列就可以不要了。