ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

字符串是否交错

2021-09-11 17:32:03  阅读:129  来源: 互联网

标签:是否 str1 交错 aim length str2 字符串 dp


从左往右尝试的模型:背包问题
样本一个作行一个作列的模型:字符串是否交错
字符串是否交错:
这个是一个做行,一个做列的模型
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 1 1 1 4
1 1 1 5
1 1 1 5 1 1 1 1 4
不知道这个1是哪个字符串中的,不知道怎么选

那怎么办呢?构建表

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

str1 a b b c
0 1 2 3
str2 b b c d
aim a b b b c b c d
0 1 2 3 4 5 6 7

0 1 2 3 4
0 T F F F F
1 T
2 T
3 T
4 F * dp[4][4]

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 static boolean isCross(String str1,String str2,String aim){
        if(str1==null||str2==null||aim==null){
            return false;
        }
        if(str1.length()+str2.length()!=aim.length()){
            return false;
        }
        char[] chs1=str1.toCharArray();
        char[] chs2=str2.toCharArray();
        char[] aimChs=aim.toCharArray();
        boolean[][] dp=new boolean[chs1.length+1][chs2.length+1];
        dp[0][0]=true;
        for(int i=1;i<=chs1.length;i++){
            if(aimChs[i]!=chs1[i]){
                break;
            }
            dp[i][0]=true;
        }
        for(int j=1;j<=chs2.length;j++){
            if(aimChs[j]!=chs2[j]){
                break;
            }
            dp[0][j]=true;
        }
        for(int i=1;i<=chs1.length;i++){
            for(int j=1;j<=chs2.length;j++){
                dp[i][j]= aimChs[i+j-1]==chs1[i-1]&&dp[i-1][j]
                        || aimChs[i+j-1]==chs2[j-1]&&dp[i][j-1];
            }
        }
        return dp[chs1.length][chs2.length];
    }

  

标签:是否,str1,交错,aim,length,str2,字符串,dp
来源: https://www.cnblogs.com/iwyc/p/15256243.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有