[LeetCode] 168. Excel Sheet Column Title (Easy)
阿新 • • 發佈:2018-12-18
題目
A message containing letters from A-Z is being encoded to numbers using the following mapping:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Given a non-empty string containing only digits, determine the total number of ways to decode it.
Example 1:
Input: "12" Output: 2 Explanation: It could be decoded as "AB" (1 2) or "L" (12).
Example 2:
Input: "226"
Output: 3
Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
思路
題目大意
由 字母 -> 數字 的對映表,推算出給定一個 數字字串,最多有多少種對應的 字母字串。
解題思路
第一版
這題和 爬梯子 的題很相似。字母對應的 數字 有1位和2位。 設 dp狀態為:dp[i] ,字串s[:i] 對應字串的最大個數。 狀態轉移方程為: dp[i] =(dp[i-2] if s[i-2:i] 存在對應的字元 else 0) + (dp[i-1] if s[i-1:i] 存在對應的字元 else 0 )
初始化 dp[0] = 1,dp[1] =1 但需要判斷 s[0] !=0。
由於 dp只用到前兩個狀態,所以這裡用 dp[0-2] 表示。
最簡化程式碼
class Solution:
sdict = {}
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
if s[0] == '0':
return 0
dp = [1,1,1]
for i in range(2,len(s) + 1):
dp[2] = (dp[1] if 0<int(s[i-1:i])<10 else 0) + (dp[0] if 9<int(s[i-2:i])<27 else 0)
dp[0] = dp[1]
dp[1] = dp[2]
return dp[2]
完整程式碼
class Solution:
sdict = {}
def numDecodings(self, s):
"""
:type s: str
:rtype: int
"""
slen = len(s)
if slen == 0:
return 1
elif slen == 1 or s[0] == '0':
return 1 if 1<= int(s[0]) <= 9 else 0
dp = [1,1,0]
for i in range(2,slen + 1):
dp[2] = (dp[1] if 0<int(s[i-1:i])<10 else 0) + (dp[0] if 9<int(s[i-2:i])<27 else 0)
dp[0] = dp[1]
dp[1] = dp[2]
return dp[2]
第二版
java 版
class Solution {
public int numDecodings(String s) {
int slen = s.length();
int[] dp = new int[slen+1];
dp[0] = 1;
dp[1] = 1;
if(s.charAt(0)=='0')
dp[1] = 0;
for(int i = 2;i<=slen;i++){
dp[i] = 0;
if(s.charAt(i-1)!='0')
dp[i] = dp[i-1];
int dval = Integer.valueOf(s.substring(i-2,i));
if(dval>=10 && dval<=26)
dp[i] += dp[i-2];
}
return dp[slen];
}
}
二維 陣列版
class Solution {
public int numDecodings(String s) {
int slen = s.length();
int[] dp = new int[slen+1];
dp[0] = 1;
dp[1] = s.charAt(0) == '0' ? 0 : 1;
for(int i = 2;i<=slen;i++){
dp[i] = 0;
if(s.charAt(i-1)!='0')
dp[i] += dp[i-1];
int dval = Integer.valueOf(s.substring(i-2,i));
if(dval>=10 && dval<=26)
dp[i] += dp[i-2];
}
return dp[slen];
}
}