91. Decode Ways
A message containing letters from A-Z
can be encoded into numbers using the following mapping:
'A' -> "1" 'B' -> "2" ... 'Z' -> "26"
To decode an encoded message, all the digits must be grouped then mapped back into letters using the reverse of the mapping above (there may be multiple ways). For example, "11106"
can be mapped into:
"AAJF"
with the grouping(1 1 10 6)
"KJF"
with the grouping(11 10 6)
Note that the grouping (1 11 06)
is invalid because "06"
cannot be mapped into 'F'
since "6"
is different from "06"
.
Given a string s
containing only digits, return the number of ways to decode it.
The test cases are generated so that the answer fits in a 32-bit integer.
Example 1:
Input: s = "12" Output: 2 Explanation: "12" could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: s = "226" Output: 3 Explanation: "226" could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
Example 3:
Input: s = "06" Output: 0 Explanation: "06" cannot be mapped to "F" because of the leading zero ("6" is different from "06").
Constraints:
1 <= s.length <= 100
s
contains only digits and may contain leading zero(s).
class Solution {
public:
bool helper(string s){
return stoi(s)>=10 && stoi(s)<=26;
}
int numDecodings(string s) {
if(s[0]=='0')return 0;
vector<int> dp(s.length()+1,0);
dp[0]=1;
dp[1]=1;
for (int i = 2; i <=s.length(); i++)
{
if(s[i-1]!='0')dp[i]=dp[i-1];
if(helper(s.substr(i-2,2)))dp[i]+=dp[i-2];
}
return dp[s.length()];
}
};
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public: | |
// to check if the string is valid or not like 06 is not valid but 10 is valid | |
bool helper(string s){ | |
return stoi(s)>=10 && stoi(s)<=26; | |
} | |
int numDecodings(string s) { | |
// if the first letter itself is 0 then no combination possible | |
if(s[0]=='0')return 0; | |
// making a dp string to store the previous result | |
vector<int> dp(s.length()+1,0); | |
// as every string of zero is possible | |
dp[0]=1; | |
// as every string of length 1 is possible in one way | |
dp[1]=1; | |
// will start from index 2 in dp and index 1 in string ( using i-1 ) | |
for (int i = 2; i <=s.length(); i++) | |
{ | |
// if s[i-1] is not 0 then possible way is same as of dp[i-1] | |
if(s[i-1]!='0')dp[i]=dp[i-1]; | |
// if s[i-2]+s[i-1] is valid and is not like 06 or 09 or 03 or 29 of 40 then we need to add to the current ways | |
if(helper(s.substr(i-2,2)))dp[i]+=dp[i-2]; | |
} | |
return dp[s.length()]; | |
} | |
}; |
0 Comments
If you have any doubts/suggestion/any query or want to improve this article, you can comment down below and let me know. Will reply to you soon.