Interleaving String

本文通过动态规划方法探讨如何判断一个字符串是否可以通过两个给定字符串交错组合而成。详细阐述了状态转移方程的构建过程,并提供了C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题如下:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = “aabcc”,
s2 = “dbbca”,

When s3 = “aadbbcbcac”, return true.
When s3 = “aadbbbaccc”, return false.

思路:
可以考虑用动态规划的思想解决这个问题,动态规划的关键在于找到或者构建状态转移方程。针对此题,可以用dp[i][j]表示s1[0~i]&s2[0~j]组成的字符串,是否能组成s3[0,i+j]。

dp[i][j] 的上一个状态包含两种情况:

dp[i-1][j], 此时是s[i-1]应该等于s[i-1+j]
dp[i][j-1], 此时是s[i-1]应该等于s[i+j-1]

这两种状态看起来简单,但是理解起来可能不是那么直观,有兴趣的读者可以在纸上画出一个矩阵出来,然后根据题目中的case走一遍,找找感觉。
其中dp是一个[s1.length()+1][s2.length()+1]的矩阵,如果s3能够被s1和s2交叉表示,那么dp的的右下角的元素dp[s1.length()][s2.length()]肯定等于true,返回其值即可。

C++可以AC的代码如下:

   bool isInterleave(string s1, string s2, string s3) {
        int m, n;
        m = s1.length();
        n = s2.length();

        if((m + n) != s3.length())
            return false;
        bool **dp = new bool*[m+1];
        for(int i=0; i<m+1; i++){
            dp[i] = new bool[n+1];
            for(int j=0; j<n+1; j++)
               dp[i][j] = false;
        }
        dp[0][0] = true;

        for(int i=0; i<m+1; i++){
            for(int j=0; j<n+1; j++){
                if(j>0 && s3[i+j-1] == s2[j-1] && dp[i][j-1]){
                    dp[i][j] = true;
                }else if(i>0 && s3[i-1 + j] == s1[i-1] &&dp[i-1][j]){
                    dp[i][j] = true;
                }
            }
        }

        return dp[m][n];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值