法一:递归
思路:很容易想到递归去解决,将大问题化作小问题。
比如 232232323232。
对于第一个字母我们有两种划分方式。
2|32232323232 和 23|2232323232
所以,如果我们分别知道了上边划分的右半部分 32232323232 的解码方式是 ans1 种,2232323232 的解码方式是 ans2 种,那么整体 232232323232 的解码方式就是 ans1 + ans2 种。可能一下子,有些反应不过来,可以看一下下边的类比。
假如从深圳到北京可以经过武汉和上海两条路,而从武汉到北京有 8 条路,从上海到北京有 6 条路。那么从深圳到北京就有 8 + 6 = 14 条路。
public int numDecodings(String s) {
return dfs(s,0);
}
private int dfs(String s, int start) {
if(start==s.length())
return 1;
if(s.charAt(start)=='0') //如果开头是0则不对应任何字母
return 0;
int ans1 = dfs(s,start+1);
int ans2 = 0;
if (start < s.length() - 1) {
int ten = (s.charAt