字符串是否交错

 

3个字符串str1,str2,-->aim

 这个是一个做行,一个做列的模型
str1
1 2 3 4

str2
a b c d

aim
a 1 2 3 b c 4 d
1 2 3 a b c d 4
以上都是str1,str2的交错组成

判段aim是否str1,str2的交错组成
1、先判段长度是否是两个的相加
2、外排的方式(两个指针)O(N+M)
没有重复字符时可以这么做,如果有重复字符这种方法行不通

外排的方式(双指针法),但无法解决有重复字符的问题



不知道这个1是哪个字符串中的,不知道怎么选

那怎么办呢?构建表

str1 下标作行 5 0-4 0-5
str2 下标作列 3 0-2 0-3
dp[i][j]代表str1只要长度为i的前缀,str2只要长度为j的前缀,
能否交错组成长度为i+j的前缀来

 

 dp[i][j]
分析普遍位置
str1 i长 str1[0...i-1]
str2 j长 str2[0...j-1]
aim i+j长 aim[0...i+j-1]

aim最后一个字符要么来自str1的最后一个字符,要么是来自str2的最后一个字符
aim[i+j-1]==str1[i-1] && dp[i-1][j]
aim[i+j-1]==str2[j-1] && dp[i][j-1]

 

 

public class CrossStr {
    public static boolean isCross(String s1,String s2,String ai)
    {
        if(s1==null||s2==null||ai==null){
            return false;
        }

        char[] str1=s1.toCharArray();
        char[] str2=s2.toCharArray();
        char[] aim=ai.toCharArray();
        if(aim.length!=str1.length+str2.length){
            return false;
        }

        boolean[][] dp=new boolean[str1.length+1][str2.length+1];
        //abc1113 // 111 //a11c223
        for(int i=1;i<=str1.length;i++){
            for(int j=1;j<=str2.length;j++){
                if((aim[i+j-1]==str1[i-1] && dp[i-1][j])
                        || (aim[i+j-1]==str2[j-1] && dp[i][j-1])){
                    dp[i][j]=true;
                }
            }
        }

        return dp[str1.length][str2.length];

    }
}

  

posted @ 2021-09-05 16:32  sherry001  阅读(28)  评论(0编辑  收藏  举报