• leetcode(c++)(双序列)


    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int lcs(string text1,string text2)
    {
        int n1 = text1.size(), n2 = text2.size();
        vector<vector<int>>dp(n1 + 1,vector<int>(n2+1));
        for(int i = 1; i <= n1; ++i)
        {
            for(int j = 1; j <= n2; ++j)
            {
                if(text1[i-1] == text2[j-1])
                {
                    dp[i][j] = 1 + dp[i-1][j-1];
                }
                else
                {
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n1][n2];
    }
    
    int help(string t1,string t2,int p1,int p2, vector<vector<int>>& memo)
    {
        if(p1 >= t1.size() || p2 >= t2.size())return 0;
        if(memo[p1][p2]!=0)return memo[p1][p2];
        if(t1[p1] == t2[p2])return 1 + help(t1,t2,p1+1,p2+1,memo);
        else return max(help(t1,t2,p1 + 1,p2,memo),help(t1,t2,p1,p2+1,memo));
    
    }
    
    int lcsI(string t1,string t2)
    {
        int n1 = t1.size(), n2 = t2.size();
        vector<vector<int>>memo(n1,vector<int>(n2));
        return help(t1,t2,0,0,memo);
    }
    
    bool isInterleave(string s1,string s2,string s3)
    {
        int m = s1.size(), n = s2.size();
        if((m + n) != s3.size())return false;
        vector<vector<bool>>dp(m+1,vector<bool>(n + 1));
        dp[0][0] = true;
        for(int i = 1; i <= m; ++i)
        {
            dp[i][0] = s3[i-1] == s1[i-1] && dp[i-1][0];
        }
        for(int i = 1; i <= n; ++i)
        {
            dp[0][i] = s3[i-1] == s2[i-1] && dp[0][i-1];
        }
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                dp[i][j] = (s3[i + j - 1] == s1[i-1] && dp[i-1][j]) || (s3[i+j-1]==s2[j-1] &&dp[i][j-1]);            
            }
        }
        return dp[m][n];
    }
    
    int editDis(string w1,string w2)
    {
        int m = w1.size(), n = w2.size();
        vector<vector<int>>dp(m + 1, vector<int>(n + 1));
        for(int i = 0; i <= m; ++i)
        {
            dp[i][0] = i;
        }
        for(int j = 0; j <= n; ++j)
        {
            dp[0][j] = j;
        }
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(w1[i-1] == w2[j-1])
                {
                    dp[i][j] = dp[i-1][j-1];
                }
                else
                {
                    dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1])) + 1;
                }
            }
        }
        return dp[m][n];
    }
    
    int numDistinct(string r,string t)
    {
        int m = r.size(), n = t.size();
        vector<vector<int>>dp(m+1,vector<int>(n + 1));
        for(int i = 0; i <= m; ++i)dp[i][0] = 1;
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(r[i-1] == t[j-1])
                {
                    dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
                }
                else
                {
                    dp[i][j] = dp[i-1][j];
                }
            }
        }
        return dp[m][n];
    }
    
    bool isMatch(string s, string p)
    {
        int m = s.size(), n = p.size();
        vector<vector<bool>>dp(m+1,vector<bool>(n+1));
        for(int i = 0; i <= m; ++i)
        {
            for(int j = 0; j <= n; ++j)
            {
                if(i == 0 && j == 0)
                {
                    dp[i][j] = true;
                    continue;
                }
                if(j == 0)
                {
                    dp[i][j] = false;
                    continue;
                }
                if(p[j-1]!='*')
                {
                    if(i > 0 && (p[j-1] =='.' || s[i-1] == p[j-1]))
                    {
                        dp[i][j] = dp[i-1][j-1];
                    }                
                }
                else
                {
                    if(j-2 >= 0)dp[i][j] = dp[i][j] | dp[i][j-2];
                    if(i >= 1 && j >= 2)dp[i][j] =dp[i][j] |
                    (( dp[i-1][j] && (p[j-2] == '.') || p[j-2] == s[i-1]));
    
                }
            }    
        }
        return dp[m][n];
    }
    
    bool isMatchI(string s, string p)
    {
        int m = s.size(), n = p.size();
        vector<vector<bool>>dp(m + 1, vector<bool>(n + 1));
        dp[0][0] = true;
        for(int j = 1; j <= n; ++j)
        {
            if(p[j - 1] == '*')
            {
                dp[0][j] = dp[0][j-1];
            }
        }
        for(int i = 1; i <= m; ++i)
        {
            for(int j = 1; j <= n; ++j)
            {
                if(p[j-1] == s[i-1] || p[j-1] == '?')
                dp[i][j] = dp[i-1][j-1];
                else if (p[j-1] == '*')
                dp[i][j] = dp[i-1][j] || dp[i][j-1];    
            }
        }
        return dp[m][n];
    }
    
    int minInsertions(string s)
    {
        string r = s;
        reverse(r.begin(),r.end());
        return s.size() - lcs(r,s);
    }
    
    int longestPalindromeSubseq(string s)
    {
        int n = s.size();
        vector<vector<int>>dp(n,vector<int>(n));
        for(int i = n - 1; i >= 0; --i)
        {
            dp[i][i] = 1;
            for(int j = i + 1; j < n; ++j)
            {
                if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;
                else dp[i][j] = max(dp[i + 1][j],dp[i][j-1]);
            }
        }
        return dp[0][n-1];
    }
    
    bool isValidPalindrome(string s, int k)
    {
        string r = s;
        reverse(r.begin(),r.end());
        return s.size() - lcs(r,s) <= k;
    }
    
    int main()
    {
        //LeetCode1143
        string text1 = "abcde",text2 = "ace";
        cout << lcs(text1,text2) << endl;
        cout << lcsI(text1,text2) << endl;
    
        //LeetCode97
        string s1 = "aabcc";
        string s2 = "dbbca";
        string s3 = "aadbbcbcac";
        cout << isInterleave(s1,s2,s3) << endl;
    
        //LeetCode72
    
        string word1 = "horse", word2 = "ros";
        cout << editDis(word1,word2) << endl;
    
        //LeetCode115
        string s = "rabbbit",t = "rabbit";
        cout << numDistinct(s,t) << endl;
    
        //LeetCode10
        s = "aa";
        string p = "a*";
        cout << isMatch(s,p) << endl;
    
        //LeetCode44
        s = "aa",p = "*";
        cout << isMatchI(s,p) << endl;
    
        //LeetCode1312
        s = "mbadm";
        cout << minInsertions(s) << endl;
    
        //LeetCode516
        s = "bbbab";
        cout << longestPalindromeSubseq(s) << endl;
    
        //LeetCode1216
        s = "abcdeca";
        int k = 2;
        cout << isValidPalindrome(s,k) << endl;
        return 0;
    }
  • 相关阅读:
    第一章计算机基础
    补充:bytes类型以及字符编码转换
    python内存相关以及深浅拷贝讲解
    python之路day15--内置函数
    python之路day14--嵌套函数、匿名函数、高阶函数。函数的递归
    python之路day13--迭代器
    python之路day14--列表生成式、生成器generator、生成器并行
    spark MLlib DataType ML中的数据类型
    spark actions 算子
    spark Transformations算子
  • 原文地址:https://www.cnblogs.com/fourmi/p/16218110.html
Copyright © 2020-2023  润新知