• [LeetCode] Interleaving String


    Given s1s2s3, 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.

    Hide Tags
     Dynamic Programming String
     
     
    思路一:dfs,递归,超时

    Time Limit Exceeded

    class Solution {
        public:
    
            bool dfs(int idx1, int idx2,int idx3, string s1, string s2, string s3) 
            {   
                //cout << "idx1	" << idx1 << endl;
                //cout << "idx2	" << idx2 << endl;
                //cout << "idx3	" << idx3 << endl;
                if(idx3 == s3.size())
                {   
                    if( idx2 == s2.size() && idx1 == s1.size())
                        return true;
                    else
                        return false;
                }   
                if(s1[idx1] == s3[idx3] && dfs(idx1+1,idx2,idx3+1,s1,s2,s3))
                    return true;
                if(s2[idx2] == s3[idx3] && dfs(idx1,idx2+1,idx3+1,s1,s2,s3))
                    return true;
                return false;
            }   
        
            bool isInterleave(string s1, string s2, string s3) 
            {   
                if((s1.size() + s2.size()) != s3.size())
                    return false;
                return dfs(0,0,0,s1,s2,s3);
            }   
    };

    思路二:dp

    设状态 f[i][j],表示 s1[0,i-1] 和 s2[0,j-1],匹配 s3[0, i+j-1]。如果 s1 的最后一个字符等
    于 s3 的最后一个字符,则 f[i][j]=f[i-1][j];如果 s2 的最后一个字符等于 s3 的最后一个字符,
    则 f[i][j]=f[i][j-1]。因此状态转移方程如下:
    f[i][j] = (s1[i - 1] == s3 [i + j - 1] && f[i - 1][j])
    || (s2[j - 1] == s3 [i + j - 1] && f[i][j - 1]);

    class Solution {
        public:
        
            bool isInterleave(string s1, string s2, string s3) 
            {   
                if((s1.size() + s2.size()) != s3.size())
                    return false;
                //f[i][j] indicates s1[0 ~ i-1] and s2[0 ~ j-1] can consititue s3[0 ~ i+j-1]
                vector<bool> tmp(s2.size() + 1 ,false);//colum size
                vector<vector<bool> >  f(s1.size() + 1, tmp);//row size
        
                f[0][0] = true;// indicate null str + null str can constitue null str
    
                for(int i = 1; i <=s2.size(); i++ )
                {   
                    if(f[0][i-1] && s2[i-1] == s3[i-1])
                        f[0][i] = true;
                }   
    
                for(int i = 1; i <=s1.size(); i++ )
                {   
                    if(f[i-1][0] && s1[i-1] == s3[i-1])
                        f[i][0] = true;
                }   
    
                for(int i = 1; i <= s1.size(); i++)
                {   
                    for(int j = 1; j <= s2.size(); j++)
                    {   
                        if((f[i-1][j] && s1[i-1] == s3[i+j-1]) ||
                                (f[i][j-1] && s2[j-1] == s3[i+j-1])) 
                                f[i][j] = true;
                    }   
                }   
                return f[s1.size()][s2.size()];
    
            }
    };
  • 相关阅读:
    Adobe Flash Player因过期而遭到阻止”的内幕起因和解决办法
    SQL中isnull,nullif,coalesce的用法
    sql server全局变量
    关于分组后字段拼接的问题
    查询某个分组中多行字段值的拼接字串的方法--access
    分组统计(平均值计算)
    excel,sql server,access数据之间相互导入导出
    数据查询和管理
    我为什么学习Windows编程
    zStack学习笔记(原创,绝对不是抄的……)
  • 原文地址:https://www.cnblogs.com/diegodu/p/4387578.html
Copyright © 2020-2023  润新知