leetcode Interleaving String
2016-09-01 21:17
393 查看
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 =
s2 =
When s3 =
When s3 =
使用动态规划,思路如下:
这是一个二维的动态规划,如s1长len1,s2长len2,建立一个(len1+1)*(len2+1)的bool数组,元素均初始化false
F[i][j]代表 s3[i+j-1] 与 s1[0]~s1[i-1]、s2[0]~s2[j] 或 s1[0]~s1[i]、s2[0]~s2[j-1] 是否满足题中条件,判断其为true还是false的条件就是 F[i-1][j] 为 true 且 s3[i-1+j] == s1[i-1],或者 F[i][j-1] 为 true 且 s3[i+j-1] == s2[j-1]。
true ; (i=0 && j=0)
F[i][j] = {
F[i-1][j]
&& (s1[i-1] == s3[i-1+j]) || F[i][j-1]
&& (s2[j-1] == s3[i+j-1]) ;(i>0 || j>0)
代码如下:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
if(len3 != len1+len2)
return false;
vector<vector<bool> >Tmp(len1+1, vector<bool>(len2+1, false));
//初始化Tmp[0][0]为true
bool tmp1 ,tmp2;
for(int i=0; i<=len1; ++i)
{
for(int j=0; j<=len2; ++j)
{
tmp1 = false;
tmp2 = false;
if(i == 0 && j == 0)
{
Tmp[i][j] = true;
continue;
}
if(i > 0)
tmp1 = Tmp[i-1][j] && (s1[i-1] == s3[i-1+j]);
if(j > 0)
tmp2 = Tmp[i][j-1] && (s2[j-1] == s3[i+j-1]);
Tmp[i][j] = tmp1 || tmp2;
}
}
return Tmp[len1][len2];
}
};
For example,
Given:
s1 =
"aabcc",
s2 =
"dbbca",
When s3 =
"aadbbcbcac", return true.
When s3 =
"aadbbbaccc", return false.
使用动态规划,思路如下:
这是一个二维的动态规划,如s1长len1,s2长len2,建立一个(len1+1)*(len2+1)的bool数组,元素均初始化false
F[i][j]代表 s3[i+j-1] 与 s1[0]~s1[i-1]、s2[0]~s2[j] 或 s1[0]~s1[i]、s2[0]~s2[j-1] 是否满足题中条件,判断其为true还是false的条件就是 F[i-1][j] 为 true 且 s3[i-1+j] == s1[i-1],或者 F[i][j-1] 为 true 且 s3[i+j-1] == s2[j-1]。
true ; (i=0 && j=0)
F[i][j] = {
F[i-1][j]
&& (s1[i-1] == s3[i-1+j]) || F[i][j-1]
&& (s2[j-1] == s3[i+j-1]) ;(i>0 || j>0)
代码如下:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
if(len3 != len1+len2)
return false;
vector<vector<bool> >Tmp(len1+1, vector<bool>(len2+1, false));
//初始化Tmp[0][0]为true
bool tmp1 ,tmp2;
for(int i=0; i<=len1; ++i)
{
for(int j=0; j<=len2; ++j)
{
tmp1 = false;
tmp2 = false;
if(i == 0 && j == 0)
{
Tmp[i][j] = true;
continue;
}
if(i > 0)
tmp1 = Tmp[i-1][j] && (s1[i-1] == s3[i-1+j]);
if(j > 0)
tmp2 = Tmp[i][j-1] && (s2[j-1] == s3[i+j-1]);
Tmp[i][j] = tmp1 || tmp2;
}
}
return Tmp[len1][len2];
}
};
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解