|n-m| <= 1是伪条件, 选或不选, dp记录返回
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
| class Solution { private String s1; private String s2; private String s3;
private int[][] m;
public boolean isInterleave(String s1, String s2, String s3) { if (s1.length() + s2.length() != s3.length()) return false; this.s1 = s1; this.s2 = s2; this.s3 = s3; this.m = new int[s1.length()+1][s2.length()+1]; for (int[] row : m) { Arrays.fill(row, -1); } return dfs(0, 0); }
private boolean dfs(int i1, int i2) { int i3 = i1 + i2; if (i1 == s1.length() && i2 == s2.length()) return true;
char ch1 = i1 >= s1.length() ? '0' : s1.charAt(i1); char ch2 = i2 >= s2.length() ? '0' : s2.charAt(i2); char ch3 = s3.charAt(i3); if (m[i1][i2] != -1) { return m[i1][i2] == 1; }
boolean ret = false; if (ch1 == ch3) { ret |= dfs(i1+1, i2); } if (ch2 == ch3) { ret |= dfs(i1, i2+1); } m[i1][i2] = ret ? 1 : 0; return ret; } }
|