字符串的交错组成

给定三个字符串str1、str2和aim,如果aim中属于str1的字符之间保持原来在str1中的顺序,对于str2也是如此,那么称aim是str1和str2的交错组成。

eg:str1 = "AB" str2  = "12"。那么"AB12",“A1B2”,“A12B”,“1A2B”等都是str1与str2的交错组成。

 

public class Solution {
    public static boolean isCross1(String str1, String str2, String aim){
        // arm的长度是len(str1) + len(str2)
        // 1.开辟状态数组 定义状态: dp[i][j]表示str1[0...i-1]与str2[0...j-1]能否构成arm[0...i+j-1]
        boolean[][] dp = new boolean[str1.length() + 1][str2.length() + 1];

        // 2. 初始条件
        dp[0][0] = true; // 空串可以由两个空串交叉构成
        char[] chs1 = str1.toCharArray();
        char[] chs2 = str2.toCharArray();
        char[] Caim = aim.toCharArray();

        // 如果两者长度不相等则直接返回false
        if (Caim.length != (chs1.length + chs2.length)){
            return false;
        }

        // 前面多少个字符是相同的
        for (int i = 1; i <= str1.length(); i++) {
            if (chs1[i-1] != Caim[i-1]){
                break;
            }
            dp[i][0] = true;
        }

        // 前面多少个字符是相同的
        for (int j = 1; j <= chs2.length; j++) {
            if (chs2[j-1] != Caim[j-1]){
                break;
            }
            dp[0][j] = true;
        }

        // 3. 计算顺序// 转移方程
        for (int i = 1; i <= chs1.length; i++) {
            for (int j = 1; j <= chs2.length; j++){
                if (dp[i - 1][j] && (chs1[i - 1] == Caim[i + j -1])){
                    dp[i][j] = true;
                } else
                    dp[i][j] = dp[i][j - 1] && (chs2[j - 1] == Caim[i + j - 1]);
            }
        }

        return dp[chs1.length][chs2.length];
    }

    public static void main(String[] args) {
        String str1 = "AB";
        String str2 = "12";

        System.out.println(isCross1(str1, str2, "AB12"));
    }
}

《IT名企--左程云》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值