我的思路:
首先尝试回溯法(深度遍历)
代码如下:
public class Solution { int res = 0; public int numDecodings(String s) { dfs(s); return res; } public void dfs(String s){ if (s.isEmpty()){ res++; return; } if (s.charAt(0) > '0'){ dfs(s.substring(1)); } if (s.length() > 1 && isAtoZ(s.charAt(0), s.charAt(1))){ dfs(s.substring(2)); } } public boolean isAtoZ(char a,char b){ if (a == '1'){ return true; }else if(a == '2' && b < '7'){ return true; }else { return false; } } }
结果:
于是使用动态规划
动态转移方程为f(n) = f(n-1) && s.charAt(n-1) != '0' + f(n-2) && isAtoZ(s.charAt(n-2),s.charAt(n-1))
public class Solution { public int numDecodings(String s) { int[] dp = new int[s.length()+1]; dp[0] = 1; //状态转移方程:f(n) = f(n-1) && s.charAt(n-1) != '0' + f(n-2) && isAtoZ(s.charAt(n-2),s.charAt(n-1)) for (int i = 1; i <= s.length(); i++) { if (s.charAt(i-1) != '0'){ dp[i] += dp[i-1]; } if (i > 1 && isAtoZ(s.charAt(i-2), s.charAt(i-1))) { dp[i] += dp[i - 2]; } } return dp[s.length()]; } public boolean isAtoZ(char a,char b){ if (a == '1'){ return true; }else if(a == '2' && b < '7'){ return true; }else { return false; } } }