LintCode 交叉字符串 动态规划
题目:原题地址
给出三个字符串:s1、s2、s3,判断s3是否由s1和s2交叉构成。
比如 s1 = "aabcc" s2 = "dbbca"
- 当 s3 = "aadbbcbcac",返回 true.
- 当 s3 = "aadbbbaccc", 返回 false.
题目相当短,就是喜欢这种言简意赅的描述= =
dp[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符,与s3中前i+j个字符的匹配与否
public boolean isInterleave(String s1, String s2, String s3) { if(s3.equals("")&&(s1.equals("")&&s2.equals(""))) return true; if(s3.equals("")||(s1.equals("")&&s2.equals(""))) return false; int m = s1.length(); int n =s2.length(); if(m+n>s3.length()) return false; boolean[][] dp = new boolean[m+1][n+1]; dp[0][0] = true; for(int i=1;i<=m;i++){ if(s1.charAt(i-1)==s3.charAt(i-1)){ dp[i][0] = true; } } for(int i=1;i<=n;i++){ if(s2.charAt(i-1)==s3.charAt(i-1)){ dp[0][i] = true; } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ //s1找到了,与s3匹配 if(s1.charAt(i)==s3.charAt(i+1+j)){ dp[i+1][j+1] = dp[i+1][j+1]||dp[i][j+1]; } //s2找到了,与s3匹配 if(s2.charAt(j)==s3.charAt(i+j+1)){ dp[i+1][j+1] = dp[i+1][j+1]||dp[i+1][j]; } } } return dp[m][n]; }