判断一个字符串是否是由另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

posted on 2016-07-01 17:03  峰小白  阅读(2247)  评论(0编辑  收藏  举报