1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| import static org.junit.Assert.assertSame;
public class DecodeWays { public int numDecodings(String s) { if (s == null || s.isEmpty() || s.equals("0")) { return 0; } int[] map = new int[s.length() + 1]; map[0] = 1; map[1] = isValid(s.substring(0, 1)) ? 1 : 0; for (int i = 2; i <= s.length(); i++) { if (isValid(s.substring(i - 1, i))) { map[i] += map[i - 1]; } if (isValid(s.substring(i - 2, i))) { map[i] += map[i - 2]; } } return map[s.length()]; } private boolean isValid(String s) { if (s == null || s.isEmpty() || s.charAt(0) == '0') { return false; } int value = Integer.valueOf(s); return value > 0 && value < 27; } @Test public void test() { assertSame(2, numDecodings("12")); } }
|