zoukankan      html  css  js  c++  java
  • (算法)交错的字符串

    题目:

    给定三个字符串A, B, C,判断C是否由A和B交错构成。交错构成的意思是,对于字符串C,可以将其每个字符标记为A类或B类,使得我A类的每个字符顺序构成了A字符串,B类的每个字符顺序构成了B字符串。如:对于A=”rabbit” B=”mq”, ”rabmbitq”是由A和B交错构成的,但”rabbqbitm”不是由A和B交错构成。

    思路:

    【动态规划】

    假设dp[i][j]表示A的前i个字符和B的前j个字符是否能够交错构成C的前i+j个字符。

    状态转移方程:

    dp[i][j]=(dp[i-1][j] && A[i-1]==C[i+j-1]) || (dp[i][j-1] && B[j-1]==C[i+j-1])

    含义:

    dp[i][j]取决于:

    1、A的前i-1个字符和B的前j个字符交错构成C的前i+j-1个字符,且A[i-1]==C[i+j-1]

    2、A的前i个字符和B的前j-1个字符交错构成C的前i+j-1个字符,且B[j-1]==C[i+j-1]

    初始状态:

    dp[0][0]=0;

    dp[i][0]=dp[i-1][0] && A[i-1]=C[i-1];   (1=<i<=m)

    dp[0][j]=dp[0][j-1] && B[j-1]=C[j-1];  (1=<j<=n)

    代码:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    bool IsCrossString(const string &c,const string &a,const string &b){
        int len_c=c.size();
        int len_a=a.size();
        int len_b=b.size();
    
        if(len_c!=len_a+len_b){
            cout<<"Error"<<endl;
            return false;
        }
    
        vector<vector<bool> > dp(len_a+1,vector<bool>(len_b+1));
    
        dp[0][0]=true;
        for(int i=1;i<=len_a;i++)
            dp[i][0]=dp[i-1][0] && (c[i-1]==a[i-1]);
    
        for(int i=1;i<=len_b;i++)
            dp[0][i]=dp[0][i-1] && (c[i-1]==b[i-1]);
    
        for(int i=1;i<=len_a;i++){
            for(int j=1;j<=len_b;j++){
                dp[i][j]=(dp[i-1][j] && (a[i-1]==c[i+j-1])) || (dp[i][j-1] && (b[j-1]==c[i+j-1]));
            }
        }
    /*
        for(int i=0;i<=len_a;i++){
            for(int j=0;j<=len_b;j++){
                cout<< dp[i][j] <<" ";
            }
            cout<<endl;
        }
    */
        return dp[len_a][len_b];
    }
    
    int main()
    {
        string a,b,c;
        while(cin>>a>>b>>c){
            cout<< IsCrossString(c,a,b) << endl;
        }
        return 0;
    }
  • 相关阅读:
    Java 学习笔记- classpath classpath*
    Java this关键字 学习笔记
    Java 基础 类加载器和双亲委派机制 学习笔记
    《Java语言实现快速幂取模》
    《2017年内蒙古自治区第十二届大学生程序设计-超级密码》
    《快速排序》
    《01-背包问题-点菜》
    微信小程序相关二、css介绍,菜单制作,表单相关,京东注册页面
    微信小程序相关一、模仿京东静态登录页面
    分别用js和css实现瀑布流
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4849508.html
Copyright © 2011-2022 走看看