[leetcode]97. Interleaving String

本文探讨了如何判断一个字符串是否可以通过两个给定字符串交织而成的问题。提供了两种解决方案:一种使用动态规划,另一种采用贪心策略。动态规划方法通过构建二维布尔矩阵来记录子问题的解,而贪心策略则试图尽可能匹配第一个字符串,遇到不匹配的情况再尝试匹配第二个字符串。

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

链接:https://leetcode.com/problems/interleaving-string/description/

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

Example 1:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
Output: true

Example 2:

Input: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
Output: false


动态规划

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        if (s1.length() + s2.length() != s3.length()) return false;
        vector<vector<bool>> dp(s1.length() + 1, vector<bool>(s2.length() + 1, false));
        dp[0][0] = true;
        
        for(int i=1; i<=s1.length(); i++)  if (s3.substr(0, i) == s1.substr(0, i)) dp[i][0] = true;
        for(int j=1; j<=s2.length(); j++) if (s3.substr(0, j) == s2.substr(0, j)) dp[0][j] = true;
        for(int i=0; i<s1.length(); i++) {
            for(int j=0; j<s2.length(); j++) {
                if (s3[i + j + 1] != s1[i] && s3[i + j + 1] != s2[j]) dp[i + 1][j + 1] = false;
                if (s3[i + j + 1] == s1[i]) dp[i + 1][j + 1] = dp[i + 1][j + 1] || dp[i][j + 1];
                if (s3[i + j + 1] == s2[j]) dp[i + 1][j + 1] = dp[i + 1][j + 1] || dp[i + 1][j];
            }
        }
        return dp.back().back();
    }
};

贪心

Travel s3 to find s1 greedily, if meet s3[k] != s1[i], we try to check whether s3[k] == s2[j], if no, go backward k and i, incease c, set c as the backward steps count.

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int i=0,j=0,k=0,c = 0;
        while(k < s3.length()) {
            if(!c && s3[k] == s1[i]) { i++; k++; continue; }
            if(s3[k] == s2[j]) { j++; k++; c = 0; continue; }
            --i; --k;    c++;
            if(k < 0) break;
        }
        return k == s3.length() && i == s1.length() && j == s2.length();
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值