求兩個字符串的最長的連續公共子串

動態規劃  
          如果只有兩個字符串,可以先建一個二維數組(實際上用不到二維數組,下面再詳細說),如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。因此算出了下一行和下一列,上一行和上一列就可以不要了。因爲我們縱保存最大值,和產生最大值的位置。所謂動態規劃,就是你算出下一行下一列,上一行上一列就可以不要了。
發佈了98 篇原創文章 · 獲贊 23 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章