LeetCode(97) Interleaving String

題目

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.git

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",github

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.測試

分析

題目給定三個字符串s1 , s2 , s3,要求斷定字符串s3是否由s1 和s2組合而成。(每一個字符串中的字母相對順序不可變)
開始看到題目,沒有解決思路。參考網友的答案,發現解決題目的兩種思路。
方法一:遞歸的思路,可是該方法對於大集合數據會出現TLE
方法二:動態規劃的思路
根據字符串1和2,創建斷定二維矩陣。

AC代碼

class Solution {
public:
	/*方法一:遞歸實現,對大數據組會TLE*/
	bool isInterleave1(string s1, string s2, string s3) {
		int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();

		if (len2 == 0)
			return s1 == s3;
		else if (len1 == 0)
			return s2 == s3;
		else if (len3 == 0)
			return len1 + len2 == 0;
		else
		{
			if (s1[0] == s3[0] && s2[0] != s3[0])
				return isInterleave1(s1.substr(1), s2, s3.substr(1));
			else if (s1[0] != s3[0] && s2[0] == s3[0])
				return isInterleave1(s1, s2.substr(1), s3.substr(1));
			else if (s1[0] == s3[0] && s2[0] == s3[0])
				return isInterleave1(s1.substr(1), s2, s3.substr(1)) || isInterleave(s1, s2.substr(1), s3.substr(1));
			else
				return false;
		}//else
	}

	/*方法二:二維動態規劃*/
	bool isInterleave(string s1, string s2, string s3) {
		int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
		if (len1 + len2 != len3)
			return false;
		else if (len2 == 0)
			return s1 == s3;
		else if (len1 == 0)
			return s2 == s3;
		else if (len3 == 0)
			return len1 + len2 == 0;
		else
		{
			vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));
			dp[0][0] = 1;
			for (int i = 1; i <= len1; ++i)
			{
				if (s1[i - 1] == s3[i - 1])
					dp[i][0] = 1;
				else
					break;
			}//for

			for (int j = 1; j <= len2; ++j)
			{
				if (s2[j - 1] == s3[j - 1])
					dp[0][j] = 1;
				else
					break;
			}//for

			for (int i = 1; i <= len1; ++i)
			{
				for (int j = 1; j <= len2; ++j)
				{
					if (s1[i - 1] == s3[i + j - 1])
						dp[i][j] = dp[i - 1][j] || dp[i][j];
					if (s2[j - 1] == s3[i + j - 1])
						dp[i][j] = dp[i][j - 1] || dp[i][j];
				}//for
			}//for
			return dp[len1][len2] == 1;
		}//else
	}
};

  

GitHub測試程序源碼
相關文章
相關標籤/搜索