列表

详情


NC346. 交错的字符串

描述

给定三个字符串 s1 , s2 , s3 ,请你验证 s3 是否是 s1 和 s2 交错组成。
交错组成的定义是,把 s1 和 s2 分别拆分成子串 a1+a2+a3..+an , b1+b2+b3+..+bn , a1+b1+a2+b2+... 或 b1+a1+b2+a2+... 可以组成 s3 就定义为交错组成。

数据范围:字符串的长度满足

示例1

输入:

"abc","defgh","abcdef"

输出:

false

示例2

输入:

"abd","cefgh","abcdefgh"

输出:

true

说明:

ab+c+d+efgh

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 6ms, 内存消耗: 524KB, 提交时间: 2022-04-15

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @param s3 string字符串 
     * @return bool布尔型
     */
    bool stringJudge(string s1, string s2, string s3) {
        // write code here
        int len1=s1.size();
        int len2=s2.size();
        int len3=s3.size();
        vector<vector<bool>>dp(len1+1,vector<bool>(len2+1,false));
        dp[0][0]=true;
        for(int i=1;i<=len1;i++){
            if(s1[i-1]!=s3[i-1]){
                break;
            }
            dp[i][0]=true;
        }
        for(int j=1;j<=len2;j++){
            if(s2[j-1]!=s3[j-1]){
                break;
            }
            dp[0][j]=true;
        }
        for(int i=1;i<=len1;i++){
            for(int j=1;j<=len2;j++){
                if(dp[i-1][j] && s1[i-1]==s3[i+j-1] || (dp[i][j-1] && s2[j-1]==s3[i+j-1])){
                    dp[i][j]=true;
                }
            }
        }
        if(dp[len1][len2]){
            return true;
        }else{
            return false;
        }
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 1416KB, 提交时间: 2022-03-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @param s3 string字符串 
     * @return bool布尔型
     */
    bool stringJudge(string s1, string s2, string s3) {
        // write code here
        bool dp[1005][1005];
        memset(dp,0, sizeof(dp));
       dp[0][0]=true;
        for(int i=0;i<=s1.size();i++)
            for(int j=0;j<=s2.size();j++)
                if((i>0&&s3[i+j-1]==s1[i-1]&&dp[i-1][j])||(j>0&&s3[i+j-1]==s2[j-1]&&dp[i][j-1]))
                   dp[i][j]=true;
        return dp[s1.size()][s2.size()];
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 520KB, 提交时间: 2022-06-27

class Solution {
  public:
    bool stringJudge(string s1, string s2, string s3) {
        int a = s1.size();
        int b = s2.size();
        int c = s3.size();
        vector<vector<bool>> v(a + 1, vector<bool>(b + 1, false));
        v[0][0] = true;
        for (int i = 1; i <= a; i++) {
            if (s1[i - 1] != s3[i - 1]) {
                break;
            }
            v[i][0] = true;
        }
        for (int j = 1; j <= b; j++) {
            if (s2[j - 1] != s3[j - 1]) {
                break;
            }
            v[0][j] = true;
        }
        for (int i = 1; i <= a; i++) {
            for (int j = 1; j <= b; j++) {
                if (v[i - 1][j] && s1[i - 1] == s3[i + j - 1] || (v[i][j - 1] &&
                        s2[j - 1] == s3[i + j - 1])) {
                    v[i][j] = true;
                }
            }
        }
        if (v[a][b]) {
            return true;
        } else {
            return false;
        }
    }
};

C++ 解法, 执行用时: 7ms, 内存消耗: 524KB, 提交时间: 2022-03-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @param s3 string字符串 
     * @return bool布尔型
     */
    bool stringJudge(string s1, string s2, string s3) {
        int i,j,len1=s1.length(),len2=s2.length(),len3=s3.length();
        bool res=(len1+len2==len3);
        if(res)
        {
            vector<vector<bool>> dp(len1+1,vector<bool>(len2+1,false));
            dp[0][0]=true;
            for(i=1;i<=len1&&s1[i-1]==s3[i-1];i++)
                dp[i][0]=true;
            for(i=1;i<=len2&&s2[i-1]==s3[i-1];i++)
                dp[0][i]=true;
            for(i=1;i<=len1;i++)
                for(j=1;j<=len2;j++)
                    dp[i][j]=((s1[i-1]==s3[i+j-1]&&dp[i-1][j])||
                              (s2[j-1]==s3[i+j-1]&&dp[i][j-1]));
            res=dp[len1][len2];
        }
        return res;
    }
};

C++ 解法, 执行用时: 8ms, 内存消耗: 548KB, 提交时间: 2022-05-21

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s1 string字符串 
     * @param s2 string字符串 
     * @param s3 string字符串 
     * @return bool布尔型
     */
    bool stringJudge(string s1, string s2, string s3) {
        int n = s1.size(), m = s2.size();
        if (n + m != s3.size()) return false;
        vector<vector<bool>> dp(n + 1, vector<bool>(m + 1));
        dp[0][0] = true;
        for (int i = 0; i <= n; ++i) {
            for (int j = 0; j <= m; ++j) {
                if (i && dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) dp[i][j] = true;
                else if (j && dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]) dp[i][j] = true;
            }
        }
        return dp[n][m];
    }
};

上一题