97. Interleaving String
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = "aabcc",
s2 = "dbbca",
When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.
---
DP
---
Solution1 : 2维数组
public class Solution { public boolean isInterleave(String s1, String s2, String s3){ if(s1.length() + s2.length() != s3.length()) return false; boolean[][] matched = new boolean[s1.length() + 1][s2.length() + 1]; matched[0][0] = true; for(int i1 = 1; i1 <= s1.length(); i1++){ if(s3.charAt(i1-1) == s1.charAt(i1-1)) { matched[i1][0] = true; }else break; } for(int i2 = 1; i2 <= s2.length(); i2++){ if(s3.charAt(i2 - 1) == s2.charAt(i2 - 1)) { matched[0][i2] = true; }else break; } for(int i1 = 1; i1 <= s1.length(); i1++){ char c1 = s1.charAt(i1 - 1); for(int i2 = 1; i2 <= s2.length(); i2++){ int i3 = i1 + i2; char c2 = s2.charAt(i2 - 1); char c3 = s3.charAt(i3 - 1); if(c1 == c3){ matched[i1][i2] = matched[i1 - 1][i2]; } if(c2 == c3){ matched[i1][i2] |= matched[i1][i2 - 1]; } } } return matched[s1.length()][s2.length()]; } }
---
Solution2: 一维滚动数组
public class Solution { public boolean isInterleave(String s1, String s2, String s3) { if(s1.length() + s2.length() != s3.length()) return false; boolean[] interleaved = new boolean[s2.length() + 1]; interleaved[0] = true; for(int i = 0; i <= s1.length(); i++) for(int j = 0; j <= s2.length(); j++){ if(i>=1) interleaved[j] = interleaved[j] & (s1.charAt(i - 1) == s3.charAt(i + j - 1)); if(j>=1) interleaved[j] |= interleaved[j - 1] & (s2.charAt(j - 1) == s3.charAt(i + j - 1)); } return interleaved[s2.length()]; } }
浙公网安备 33010602011771号