最近在複習期末考試,又有點懶,更新部落格的效率也下降了。
話不多說,我們來刷一遍子串行問題,用動態規劃的方法。一、300. 最長上公升子串行 (難易程度:medium)
原題鏈結:
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。
你演算法的時間複雜度應該為 o(n2) 。
高階: 你能將演算法的時間複雜度降低到 o(n log n) 嗎?
解題思路:
對於子串行問題,動態規劃方法是,定義乙個 dp 陣列,其中 dp[i] 表示以 i 結尾的子串行的性質。在處理好每個位置後,統計一遍各個位置的結果即可得到題目要求的結果。
dp[i] 可以表示以 i 結尾的、最長子序列長度。對於每乙個位置 i,如果其之前的某個位置 j 所對應的數字小於位置 i 所對應的數字,則我們可以獲得乙個以 i 結尾的、長度為 dp[j]+ 1 的子串行。為了遍歷所有情況,我們需要 i 和 j 進行兩層迴圈,其時間複雜度為 o(n 2 )。
後面都可以按照這個模板來做。
好,來看一下**:
class
solution
} ans=
max(ans, dp[i]);
}return ans;}}
;
二、1143. 最長公共子串行(難易程度:medium)
原題鏈結:
給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
示例 1:
輸入:text1 = 「abcde」, text2 = 「ace」
輸出:3
解釋:最長公共子串行是 「ace」,它的長度為 3。
示例 2:
輸入:text1 = 「abc」, text2 = 「abc」
輸出:3
解釋:最長公共子串行是 「abc」,它的長度為 3。
示例 3:
輸入:text1 = 「abc」, text2 = 「def」
輸出:0
解釋:兩個字串沒有公共子串行,返回 0。
解題思路:
和上面一樣,只不過要注意處理邊界(第0行、第0列)的情況。
**如下:
class
solution
else dp[i][0
]=dp[i-1]
[0];
}for
(int j=
1; j)else dp[0]
[j]=dp[0]
[j-1];
}for
(int i=
1; i)else
ans=
max(ans, dp[i]
[j]);}
}return ans;}}
;
未完待續,明天更新… 動態規劃3 最長公共子串行問題
一些概念 1 子串行 乙個序列a a1,a2,an,中任意刪除若干項,剩餘的序列叫做a的乙個子串行。也可以認為是從序列a按原順序保留任意若干項得到的序列。例如 對序列 1,3,5,4,2,6,8,7來說,序列3,4,8,7 是它的乙個子串行。對於乙個長度為n的序列,它一共有2 n 個子序列,有 2 ...
動態規劃 最常公共子串行問題
前面一篇博文動態規劃 矩陣連乘問題,學習了什麼是動態規劃,以及什麼時候該用動態規劃,總得來說就是 當乙個問題可以被分成若干個子問題求解,且子問題可以優化子結構,存在子問題重複的時候,就可以使用動態子結構。最長公共子串行的定義 設 兩個序列分別為 x y 他們的最長公共子串行為 z 那麼就存在下面這幾...
動態規劃 公共子串行
公共子串行 總時間限制 1000ms 記憶體限制 65536kb 描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在 嚴格上公升 的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給...