首页 > 代码库 > 数字解码方法数问题
数字解码方法数问题
A message containing letters from A-Z
is being encoded to numbers using the following mapping:‘A‘ -> 1
‘B‘ -> 2 ... ‘Z‘ -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message "12"
, it could be decoded as "AB"
(1 2) or "L"
(12).
The number of ways decoding "12"
is 2.
==============================昏割线========================
本来是自己想了半天的划分情况,修修改改,总是要遗漏情况,怼上代码,不做分析。
public static int numDecodings(String s) { // Write your code here if(0 == s.length()) return 0; if(s.charAt(0)==‘0‘) return 0; if(s.length() == 1) return 1; int []dp = new int[s.length()];//记录遍历到字符串第i位置时的状态(该状态指的是编码的方法数) dp[0] = 1; for(int i=1;i<s.length();i++){ String temp = s.substring(i-1, i+1);// 取i位和i-1位 int num = Integer.parseInt(temp); if(num == 0){ return 0; }else if(1 <= num && num <= 9) dp[i] = dp[i-1]; else if(11 <= num && num <= 19 || num >=21 && num <= 26) dp[i] = dp[i-1] + (i - 2 >= 0 ? dp[i-2] : 1); else if(num % 10 == 0) if(num/10 >= 3 ) return 0; else dp[i] = i - 2 >= 0 ? dp[i-2] : 1; else dp[i] = dp[i-1]; } return dp[s.length()-1]; }
铛铛铛铛铛铛!推出较优解:
另f[i] 表示 在 i 位置时,解码的方法数。显然,f[i] 可由之前的2个状态得出。
① 选择单独解码第i个位置,此时,f[i] = f[i-1]
② 选择解码i 和i - 1 位置, 此时, f[i] = f[i - 2]
class Solution { public: int decodeOne(char one) { return (one == ‘0‘) ? 0 : 1; // 判断单个字符能否解码 } int decodeTwo(char one, char two) { if( (one == ‘1‘) || (one == ‘2‘ && two <= ‘6‘) ) // 判断双字符的解码情况 return 1; else return 0; } int fun(string s, int i) { if(i == 0 ) return decodeOne(s[0]); // 只有1个字符,直接判断 if(i == 1) return ( decodeOne(s[0]) & decodeOne(s[1]) ) + decodeTwo(s[0], s[1]); // 2个字符, 先单个, 再2个 if(i >= 2) { int sum = 0; if(decodeOne(s[i])) sum += fun(s, i-1); if(decodeTwo(s[i-1], s[i]) ) sum += fun(s, i-2); return sum; } } int numDecodings(string s) { if(s.size() == 0 || s[0] == ‘0‘) return 0; return fun(s, s.size() - 1); } };
数字解码方法数问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。