交叉字串 LintCode

2021-08-17 19:24:04 字數 1159 閱讀 8024

給出三個字串:s1、s2、s3,判斷s3是否由s1和s2交叉構成。

樣例 比如 s1 = 「aabcc」 s2 = 「dbbca」

- 當 s3 = 「aadbbcbcac」,返回 true.

- 當 s3 = 「aadbbbaccc」, 返回 false.

挑戰 要求時間複雜度為o(n^2)或者更好

思路 先考慮特殊情況,s1為空直接比較s2和s3,s2為空比較s1和s3,s3為空,返回false(此時s1,s2均不為空)。如果s1,s2的長度之和不等於s3的長度,也返回false。

dp[i][j]表示s1的前i個字元與s2的前j個字元,是否可以交叉構成s3的前i+j個字元。對於dp[i][j]只需要考慮dp[i][j-1]和dp[i-1][j]: 當dp[i][j-1]為true,s1的前i個字元與s2的前j-1個字元交叉構成s3的前i+j-1個字元,此時比較s2的第j個字元和s3的第i+j個字元;當dp[i-1][j]為true,s1的前i-1個字元與s2的前j個字元交叉構成s3的前i+j-1個字元,此時比較s1的第i個字元和s3的第i+j個字元

#ifndef c29_h

#define c29_h

#include

#include

#include

using

namespace

std;

class solution

//當i = 0,只考慮s2和s3

for (int j = 1; j <= len2; ++j)

//對於dp[i][j]只需要考慮dp[i][j-1]和dp[i-1][j]

//當dp[i][j-1]為true,s1的前i個字元與s2的前j-1個字元交叉構成s3的前i+j-1個字元

//此時比較s2的第j個字元和s3的第i+j個字元

//當dp[i-1][j]為true,s1的前i-1個字元與s2的前j個字元交叉構成s3的前i+j-1個字元

//此時比較s1的第i個字元和s3的第i+j個字元

for (int i = 1; i <= len1; ++i)

if (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1])}}

return dp[len1][len2];

}};#endif

LintCode 29 交叉字串

目錄描述 給出三個字串 s1 s2 s3,判斷s3是否由s1和s2交叉構成。您在真實的面試中是否遇到過這個題?是 樣例 比如 s1 aabcc s2 dbbca 當 s3 aadbbcbcac 返回 true.當 s3 aadbbbaccc 返回 false.挑戰 要求時間複雜度為o n 2 或者更...

交叉字串

給出三個字串 s1 s2 s3,判斷s3是否由s1和s2交叉構成。樣例 比如 s1 aabcc s2 dbbca 當 s3 aadbbcbcac 返回 true.當 s3 aadbbbaccc 返回 false.dp i j k 代表 當到了s3的第i位時,s1的到了第j位 s2到了第k位。因為i是...

LintCode 翻轉字串

翻轉字串 給定乙個字串,逐個翻轉字串中的每個單詞。樣例 給出s the sky is blue 返回 blue is sky the 說明 單詞的構成 無空格字母構成乙個單詞 輸入字串是否包括前導或者尾隨空格?可以包括,但是反轉後的字元不能包括 如何處理兩個單詞間的多個空格?在反轉字串中間空格減少到...