給出三個字串: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 說明 單詞的構成 無空格字母構成乙個單詞 輸入字串是否包括前導或者尾隨空格?可以包括,但是反轉後的字元不能包括 如何處理兩個單詞間的多個空格?在反轉字串中間空格減少到...