Leetcode(C++)
題目 : https://leetcode.com/problems/decode-ways/ 。
想法 :
類似爬梯子的DP,但是有特殊條件要處理。
1. 如果是0開頭、0前面不是接1 or 2就一定是False。
2. 能往前算2格的狀態只有26以內,所以要往前看確認是狀態轉移1格還是2格,注意前方是0,所以我先預處理把10跟20標成XX。
時間複雜度 : O(n)。
程式碼 :
class Solution {
public:
int numDecodings(string s) {
int l=s.size(), sum[110]={0}, ok=1;
if(s[0] == '0') return 0;
for(int i=1 ; i<l ; i++){
if(s[i] == '0'){
if(s[i-1] == '1' || s[i-1] == '2'){
s[i-1]='X'; s[i]='X';
}
else{
ok=0; break;
}
}
}
sum[0]=1;
if(s[0] == '1' && s[1]-'0' > 0 && s[1]-'0' <= 9) sum[1]=2;
else if(s[0] == '2' && s[1]-'0' <= 6) sum[1]=2;
else if(s[0] == 'X' && s[1] == 'X') sum[0]=sum[1]=1;
else if(s[1] == 'X' && s[2] == 'X') sum[1]=sum[2]=1;
else sum[1]=1;
for(int i=2 ; i<l&&ok ; i++){
if(s[i] == 'X'){
i++;
sum[i]+=sum[i-2];
}
else{
sum[i]+=sum[i-1];
if(s[i-1] == '1') sum[i]+=sum[i-2];
if(s[i-1] == '2' && (s[i]-'0' <= 6)) sum[i]+=sum[i-2];
}
}
/*for(int i=0 ; i<l ; i++){
cout << sum[i];
}*/
if(!ok) return 0;
return sum[l-1];
}
};
題目 : https://leetcode.com/problems/richest-customer-wealth/ 。 想法 : 語法。 時間複雜度 : O(n*m)。 程式碼 : (JAVA)
Feb 5, 2022題目 : https://leetcode.com/problems/coin-change-2/ 。 想法 : 無窮背包問題。 時間複雜度 : O(n*m)。 程式碼 : (JAVA)
Feb 5, 2022題目 : https://leetcode.com/problems/integer-break/ 。 想法 : 規律就在2跟3身上(?),把一個數字分解成2跟3的總和就好。 時間複雜度 : O(1)。 程式碼 : (JAVA)
Feb 5, 2022題目 : https://leetcode.com/problems/longest-common-subsequence/ 。 想法 : LCS。 if(str[i] == str[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
Feb 5, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up