字符串的交错组成 动态规划

来源:互联网 发布:深圳云计算招聘岗位 编辑:程序博客网 时间:2024/05/17 08:49

1、问题描述

给定三个三个字符串str1,str2和aim,如果aim包含且仅包含来自str1和str2的所有字符,而且在aim中属于str1的字符之间还保持原来的顺序,属于str2中的字符也是如此,那么称aim是str1和str2的交错组成。判断aim是不是str1和str2的交错组成。


2、输入

第一行输入str1,第二行输入str2,第三行输入aim


3、输出

如果是交错组成输出 1 ,否则输出 0 。


4、题目解析

1)在本题中有一个隐含的关键条件:aim的长度始终等于str1的长度加上str2的长度,也就是说当str1长度为i,str2长度为j的时候,aim的长度为i+j。

2)则状态dp[i][j]就代表aim[0...i+j-1]是不是str1[0...i-1]和str2[0...j-1]的交错组成。

3)判断是不是交错组成条件:dp[i][j-1]&&str2[j-1]==aim[i+j-1]或者dp[i-1][j]&&str1[i-1]==aim[i+j-1];否则是false


5、下面是代码:

#include<iostream>#include<vector>#include<string>using namespace std;bool isCross(string, string, string);int main() {string str1, str2, aim;getline(cin, str1);getline(cin, str2);getline(cin, aim);cout << isCross(str1, str2, aim) << endl;}bool isCross(string str1, string str2, string aim) {int i, j;int len1, len2, len_aim;len1 = str1.length();len2 = str2.length();len_aim = aim.length();if (len_aim != len1 + len2) {return false;}vector<vector<int>>dp(len1 + 1, vector<int>(len2 + 1));//dp[i][j]代表aim前i+j位是否是str1的前i位和str2的前j位的交错组成,dp[0][0]代表空字符串   //为dp赋值dp[0][0] = 1;for (i = 1; i < len1 + 1; ++i) {if (str1[i - 1] == aim[i - 1])dp[i][0] = 1;elsedp[i][0] = 0;}for (j = 1; j < len2 + 1; ++j) {if (str2[j - 1] == aim[j - 1])dp[0][j] = 1;elsedp[0][j] = 0;}for (i = 1; i < len1 + 1; ++i) {for (j = 1; j < len2 + 1; ++j) {if (dp[i - 1][j] == 1 && aim[i + j - 1] == str1[i - 1]) {//要注意边界dp[i][j] = 1;}else if (dp[i][j - 1] == 1 && aim[i + j - 1] == str2[j - 1]) {dp[i][j] = 1;}else {dp[i][j] = 0;}}}if (dp[len1][len2] == 1)return true;elsereturn false;}