判断一个字符串是否是由另2个字符串交错组成的
现在有3个字符串s1,s2,s3,我们需要判断s3是否是由s1和s2交错组成的。对于三个字符串A,B,C。我们称C由A和B交错组成当且仅当C包含且仅包含A,B中所有字符,且对应的顺序不改变
例如s1="abc",s="1234d",s3="ab1234dc",那么s3是由s1和s2交错组成的,如果s3="ab1234cd",则s3不是由s1和s2交错组成的。
public boolean isjiaocuo(String s1, String s2, String s3) { boolean[][] table = new boolean[s1.length()+1][s2.length()+1]; for(int i=0; i<s1.length()+1; i++) for(int j=0; j< s2.length()+1; j++){ if(i==0 && j==0) table[i][j] = true; else if(i == 0) table[i][j] = ( table[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)); else if(j == 0) table[i][j] = ( table[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1)); else table[i][j] = (table[i-1][j] && s1.charAt(i-1) == s3.charAt(i+j-1) ) || (table[i][j-1] && s2.charAt(j-1) == s3.charAt(i+j-1)); } return table[s1.length()][s2.length()]; }
这段代码的解释如下:
dp表代表当s1在i处是交错的同时s2在j处是交错的s3在i+j处是否是交错的。
如果s1和s2在当前位置是空,s3也是空,则我们视为true;如果s1是空,s2之前的位置是交错的而且s2在当前位置和s3的当前位置字符是一样的,则视为true;反之s2为空时情况是一样的。
现在考虑s1和s2都不为空的情况。当我们从i-1,j到达i,j处时,如果i-1,j处是交错的而i处与当前的s3一致,则视为true;
当我们从i,j-1到达i,j处时,如果i,j-1处是交错的而j处与当前的s3一致,则视为true;
参考https://leetcode.com/discuss/11694/my-dp-solution-in-c