交错字符串——动态规划

原创 2015年07月09日 10:14:35

题目描述:

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


解题思路:


1、直接顺序比较,从C中依次拿掉A,看剩下的是不是等于B,若是则返回true,否则,返回false. 但是如果A和B中有相同的字符,则这种方法会出错。

例如,A=“aa”, B=“ab”,C=“aaba”  这种情况下,上述这种方法会返回false,但实际上它是true。 因此这种方法不可行。


2、采用动态规划的方法

定义状态:dp[i][j] 代表是A的前i个字符与C中匹配,B中前j个字符与C中匹配.


递推的比较过程中如果知道s1,s2上的指针p,q的情况,s3上这个指针肯定在p+q的位置。利用这个结论,就可以设计出O(m1*m2)的DP方案。

执行操作分为两步,分别判断:

A[i-1] == C[i+j-1]  为真,则 dp[i][j] = dp[i][j] || dp[i-1][j] 


B[j-1] == C[i+j-1] 为真,则dp[i][j] = dp[i][j] || dp[i][j-1]

最后返回:dp[i][j],此时,i=s1.lenth(),  j=s2.length()


参考代码:

#include"iostream"
#include"vector"
using namespace std;

class Solution
{
public:
	bool isInterleave(string s1, string  s2, string s3)
	{
		size_t len1, len2;
		len1 = s1.length();
		len2 = s2.length();

		if (len1 + len2 != s3.length())
			return false;
		vector<vector<bool>> dp;//定义变量
		dp.resize(len1 + 1, vector<bool>(len2 + 1, false));//分配空间

		dp[0][0] = true;
		for (int i = 0; i <= len1 ;i++)
		for (int j = 0; j <= len2 ; j++)
		{
			if (i == 0 && j == 0) 
				continue;

			if (i>0){
				if (s1[i - 1] == s3[i + j - 1]){
					dp[i][j] = dp[i][j] || dp[i - 1][j];
				}
			}
			if (j>0){
				if (s2[j - 1] == s3[i + j - 1]){
					dp[i][j] = dp[i][j] || dp[i][j - 1];
				}
			}
		}
		bool result = dp[len1][len2];
		return result;
	}
};

int main()
{
	Solution S;
	string s1 = "aa";
	string s2 = "ab";
	string s3 = "aaba";
	bool ans = S.isInter(s1, s2, s3);
	if (ans)
		cout << "true" << endl;
	else
		cout << "false" << endl;


}


这道题目跟最长公共子序列有点相似,思路类似,稍作变换.

LCS是判断一个串,这个题目是同时判断两个串。




动态规划——字符串的交错组成(interleaving-string)

题目描述:要求是判断一个字符串能不能由两个字符串按照它们自己的顺序,每次挑取两个串中的一个字符来构造出来。 For example, Given: s1 ="aabcc", s2 ="dbbca",...

动态规划解决字符串交错组成问题

给定str1,str2,aim,若aim是仅包含str1,str2中的字符。若aim中属于str1的字符仍然保持在str1中原来的顺序,属于str2的字符仍然保持在str2中原来的顺序,则称aim是s...

动态规划交错匹配问题

题目题目分析 对动态规划题目的理解不是特别深,所以看了别人的博客进行学习,给出博客地址交错匹配博客,说的非常好也非常详细,但是预处理写的不是很好,我用自己想到的思路写了出来,清晰明白一点。 #in...

动态规划-交错组成

动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下: 字符串A和B假如为“AB”和“12”,交错组成是两个字符串组成一个字符串。 第一步:我们以dp[i]...

求两字符串最长公共子序列——动态规划

1.“两字符串最长公共子序列”的概念;         一个字符串的子序列,是指从该字符串中去掉任意多个字符后剩下的字符在不改变顺序的情况下组成的新字符串。这个子序列是可以不连续的。最长公共子序列,是...

算法之美——求解 字符串间最短距离(动态规划)

算法之美——求解 字符串间最短距离(动态规划) 分类: 算法 动态规划2012-09-04 18:20 1796人阅读 评论(2) 收藏 举报 distancestring算法in...

算法——动态规划算法求解字符串的编辑距离

当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念)。 动态规划版求解菲波那切数列关于朴素递归求解菲波那切数列...

算法之美——求解 字符串间最短距离(动态规划)

Minimum Edit Distance 问题   解法一: 对于不同的字符串,判断其相似度。           定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: ...

动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理

动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离 一、最大子序列         最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:交错字符串——动态规划
举报原因:
原因补充:

(最多只允许输入30个字)