import java.util.*; /** * NC346 交错的字符串 * @author d3y1 */ public class Solution { private int len1; private int len2; private int len3; private boolean result = false; /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s1 string字符串 * @param s2 string字符串 * @param s3 string字符串 * @return bool布尔型 */ public boolean stringJudge (String s1, String s2, String s3) { return solution1(s1, s2, s3); // return solution2(s1, s2, s3); } /** * 动态规划 * * dp[i][j]表示s1的前i个字符与s2的前j个字符能否交错组成s3的前缀字符串(前i+j个字符) * * dp[i][j] |= dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1) , i>0 * dp[i][j] |= dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1) , j>0 * * @param s1 * @param s2 * @param s3 * @return */ private boolean solution1(String s1, String s2, String s3){ len1 = s1.length(); len2 = s2.length(); len3 = s3.length(); if(len1+len2 != len3){ return false; } boolean[][] dp = new boolean[len1+1][len2+1]; dp[0][0] = true; for(int i=0; i<=len1; i++){ for(int j=0; j<=len2; j++){ if(i > 0){ dp[i][j] |= dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1); } if(j > 0){ dp[i][j] |= dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1); } // if(i==0 && j==0){ // dp[i][j] = true; // }else if(i>0 && j==0){ // if(dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1)){ // dp[i][j] = true; // } // }else if(i==0 && j>0){ // if(dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1)){ // dp[i][j] = true; // } // }else if(i>0 && j>0){ // if(dp[i-1][j] && s1.charAt(i-1)==s3.charAt(i+j-1)){ // dp[i][j] = true; // continue; // } // if(dp[i][j-1] && s2.charAt(j-1)==s3.charAt(i+j-1)){ // dp[i][j] = true; // } // } } } return dp[len1][len2]; } /** * dfs: 遍历解空间 * @param s1 * @param s2 * @param s3 * @return */ private boolean solution2(String s1, String s2, String s3){ len1 = s1.length(); len2 = s2.length(); len3 = s3.length(); if(len1+len2 != len3){ return false; } dfs(s1, s2, s3, 0, 0, 0); return result; } /** * dfs: 递归 * @param s1 * @param s2 * @param s3 * @param index1 * @param index2 * @param index3 */ private void dfs(String s1, String s2, String s3, int index1, int index2, int index3){ if(result){ return; } if(index1+index2 == len3){ result = true; return; } if(index1 < len1){ if(s1.charAt(index1) == s3.charAt(index3)){ dfs(s1, s2, s3, index1+1, index2, index3+1); } } if(index2 < len2){ if(s2.charAt(index2) == s3.charAt(index3)){ dfs(s1, s2, s3, index1, index2+1, index3+1); } } } }