Interleaving String

来源:互联网 发布:广州市淘宝客服招聘 编辑:程序博客网 时间:2024/05/02 21:45

这种问题一看就是典型的动态规划问题,但是不好做啊。

s1 = a1 a2 ... ai

s2 = b1 b2 ... bj

s3 = c1 c2 ... c(i + j)

下面进行考察,

  1. 如果ai == c(i + j),那么问题变为考察a1 a2 ... a(i - 1),b1 b2 ... bj,c1 c2 ... c(i + j - 1)是否匹配;
  2. 如果bj == c(i + j),类似;
  3. 否则,不匹配。
设计一个数组match[i][j]来记录a1 a2 ... ai,b1 b2 ... bj能否恰当匹配c1 c2 ... c(i + j),然后动态规划即可。注意初始条件,match[0][0] = true意味着两个空串显然能匹配到第三个空串。在i == 0或者j == 0时,就演变为另一个串能否匹配目标串的问题了。

class Solution {public:bool isInterleave(string s1, string s2, string s3) {if (s1.length() + s2.length() != s3.length())return false;vector<vector<bool>> match(s1.length() + 1, vector<bool>(s2.length() + 1, false));match[0][0] = true;for (int j = 1; j <= s2.length(); ++j) {if (s2[j - 1] == s3[j - 1])match[0][j] = match[0][j - 1];elsematch[0][j] = false;}for (int i = 1; i <= s1.length(); ++i) {if (s1[i - 1] == s3[i - 1])match[i][0] = match[i - 1][0];elsematch[i][0] = false;}for (int i = 1; i <= s1.length(); ++i)    for (int j = 1; j <= s2.length(); ++j) {    if (s3[i + j - 1] != s1[i - 1] && s3[i + j - 1] != s2[j - 1]) {    match[i][j] = false;    continue;    }    if (s3[i + j - 1] == s1[i - 1])    match[i][j] = match[i][j] || match[i - 1][j];    if (s3[i + j - 1] == s2[j - 1])    match[i][j] = match[i][j] || match[i][j - 1];    }return match[s1.length()][s2.length()];}};

http://oj.leetcode.com/problems/interleaving-string/

0 0