最長遞增子序列問題圖文分析

1、題目:

求一個由n個整數組成的整數序列的最長遞增子序列。一個整數序列的遞增子序列能夠是序列中非連續的數按照原序列順序排列而成的。 最長遞增子序列是其遞增子序列中長度最長的。數組

 

2、解題思路:

建立一個結果字符串,用於保存最長子序列。spa

對於原序列中的每一個數,若知足條件能夠選擇放入或不放入,若不知足條件,則不可放入。3d

經過遞歸的思想,能夠很快將序列的全部可能結果得出,再經過判斷其大小,從而選出最大的序列。code

上圖分析:blog

  黑線表明放入符合條件的下一個數,黃線表示不放入,綠色橢圓裏的序列即爲最後可能獲得的結果(上圖獲得123的支線還沒畫完整)。遞歸

  以34123爲例,一開始能夠選擇往答案序列放入3或不放入3,放入3後能夠選擇放入4或不放入4(放入的數必須大於前一個放入的數),一直這樣下去,直到讀到原始序列的最後一個數或再也找不出符合條件的數,最後經過比較,獲得答案序列最長的序列。字符串

 

3、實現代碼

 1 public class Long_list {
 2     public String list(char s[]) {
 3         String t = "";
 4         return l(s, t, 0);
 5     }
 6 
 7     private String l(char s[], String t, int lo) {// 從頭至尾判斷符合條件的每一位放入與不放入的狀況
 8         if (lo > s.length - 1) {// 最後一位已經判斷完 出口1
 9             return t;
10         }
11         String k = "";
12         for (int i = lo; i < s.length; i++) {
13             if ((t.length() == 0) || ((t.length() - 1 >= 0) && t.charAt(t.length() - 1) < s[i])) {
14                 k = t + s[i];// 鏈接
15                 break;
16             }
17         }
18         return max(l(s, t, lo + 1), l(s, k, lo + 1));
19     }
20 
21     private String max(String l, String l2) {
22         return l.length() >= l2.length() ? l : l2;
23     }
24 
25     public static void main(String[] args) {
26         char c[] = { '3', '1', '4', '2', '3' };
27         Long_list ll = new Long_list();
28         System.out.println(ll.list(c));
29     }
30 }
相關文章
相關標籤/搜索