
題目解析: 給定兩個字串,找出最長的共同子序列長度。子序列是指在不改變相對順序的情況下,刪除部分字元後產生的新字串
解題思路: 設二維陣列dp,大小是兩個字串長度加1,初始都設為0。丟進雙層迴圈把兩個字串的字元一個一個抓出來比對。如果字元一樣,就把左上角的值加1存進去;如果不一樣,就挑上方跟左方比較大的那個值存進去。迴圈跑完,陣列右下角最後一格的值就是答案
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
int n = text1.size(), m = text2.size();
vector> dp(n + 1, vector(m + 1, 0));
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
if (text1[i-1] == text2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
return dp[n][m];
}
};

題目解析: 收集股票的每日報價,回傳今天價格的跨度。跨度是指從今天往回推算,連續幾天的價格小於或等於今天
解題思路: 設陣列v存價格跟索引,變數pos記天數。新價格進來時,如果陣列最後的價格小於等於今天,就把它拔掉,直到出現比今天大的價格為止。若陣列空了跨度就是pos+1,不然就是pos減去陣列最後面那天的索引。最後把今天價格跟索引塞進去,pos加1並回傳跨度
class StockSpanner {
public:
StockSpanner() {
}
vector> v;
int pos = 0;
int next(int price) {
while (!v.empty() && v.back().first <= price) {
v.pop_back();
}
int ans = v.empty() ? pos + 1 : pos - v.back().second;
v.push_back({price, pos});
pos++;
return ans;
}
};