小米OJ #6 交叉队列

将题目可以转换成寻找一条路径。走过s1或s2时,不能跳过或回头,只能沿着当前字符串前进或者跳到另一个字符串上一次走到的位置。
利用dp[i][j]记录路径,i表示走到s1的当前位置,j表示走到s2的当前位置,dp[i][j]表示当前路径是否等于与s3截止到 i+j 的相等。

#include <bits/stdc++.h>
using namespace std;
void ipize()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
}
string s1, s2, s3;
string temp;
stringstream ss;
int dp[1001][1001];

int main()
{
    ipize();
    while (cin >> temp)
    {
        // input.
        ss.clear();
        for (int i = 0; i < temp.size(); i++)
            if (temp[i] == ',')
                temp[i] = ' ';
        ss << temp;
        ss >> s1 >> s2 >> s3;

        memset(dp, 0, sizeof(dp));
        dp[0][0] = true;
        int len1 = s1.length();
        int len2 = s2.length();

        // cal.
        for (int i = 1; i <= len1; i++)
            dp[i][0] = dp[i - 1][0] && (s3[i - 1] == s1[i - 1]);
        for (int i = 1; i <= len2; i++)
            dp[0][i] = dp[0][i - 1] && (s3[i - 1] == s2[i - 1]);
        for (int i = 1; i <= len1; i++)
            for (int j = 1; j <= len2; j++)
            {
                int x = i + j;
                if (s3[x - 1] == s1[i - 1])
                    dp[i][j] = dp[i][j] || dp[i - 1][j];
                if (s3[x - 1] == s2[j - 1])
                    dp[i][j] = dp[i][j] || dp[i][j - 1];
            }
        cout << (dp[len1][len2] ? "true" : "false") << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值