Leetcode 87. Scramble String
阿新 • • 發佈:2019-02-02
問題
解法1
遞迴
時間複雜度O(n^n)?
class Solution {
public:
bool isScramble(string s1, string s2) {
if (s1.size() != s2.size())
return false;
if (s1.size() ==1)
return s1==s2;
int num[256]={0};
for (int i=0; i<s1.size(); ++i)
{
++num[s1[i]];
--num[s2[i]];
}
for (int i=0; i< 256; ++i)
if (num[i])
return false;
for (int i=1; i<s1.size(); ++i)
{
if (isScramble(s1.substr(0, i), s2.substr(0, i)) && isScramble(s1.substr(i), s2.substr(i)) ||
isScramble(s1.substr(0, i), s2.substr(s1.size() -i)) && isScramble(s1.substr(i), s2.substr(0 , s1.size()-i)))
return true;
}
return false;
}
};
解法二
dp 時間複雜度(n^4) 空間複雜度(n^3)
class Solution {
public:
bool isScramble(string s1, string s2) {
if (s1.size() != s2.size())
return false;
int n = s1.size();
if (n==0)
return true;
if (n==1)
return s1 == s2;
bool dp[n+1][n][n];
memset(dp, 0, sizeof(dp));
for (int x =0; x< n; ++x)
for (int y=0; y<n; ++y)
if (s1[x] == s2[y])
dp[1][x][y] = true;
for (int len = 2; len <=n; ++len)
for (int x=0; x+len <=n; ++x)
for (int y =0; y+len<=n; ++y)
for (int len1=1; len1<len; ++len1)
{
int len2 = len -len1;
if (dp[len1][x][y] && dp[len2][x+len1][y+len1] || dp[len1][x][y+len2] && dp[len2][x+len1][y])
dp[len][x][y] = true;
}
return dp[n][0][0];
}
};