先贴一个直观的解法:递归。注意题目中给的接口中string不是用的引用,所以每次调用都会复制string,因为在递归过程中并不会改变string,所以用const 引用速度会快一点,在相同条件下, 在Leetcode上大概快了10ms左右。
class Solution {
public:
bool sameChars(const string& s1,const string& s2)
{
unordered_map<char,int> mmap;
int sz=s1.size();
for(int i=0;i<s1.size();++i)
{
if(mmap.count(s1[i]))
{
mmap[s1[i]]++;
}
else
{
mmap[s1[i]]=1;
}
}
for(int i=0;i<s2.size();++i)
{
if(mmap.count(s2[i]))
{
if(mmap[s2[i]]<=0)
{
return false;
}
sz--;
mmap[s2[i]]--;
}
else
{
return false;
}
}
if(sz!=0)
{
return false;
}
else
{
return true;
}
}
bool myScramble(const string& s1, const string& s2) {
if(s1==s2)
{
return true;
}
if(!sameChars(s1,s2))
{
return false;
}
for(int i=1;i<s1.size();++i)
{
if(myScramble(s1.substr(0,i),s2.substr(0,i))&&(myScramble(s1.substr(i,s1.size()-i),s2.substr(i,s1.size()-i))))
{
return true;
}
if(myScramble(s1.substr(i,s1.size()-i),s2.substr(0,s1.size()-i))&&myScramble(s1.substr(0,i),s2.substr(s1.size()-i,i)))
{
return true;
}
}
return false;
}
bool isScramble(string s1, string s2){
return myScramble(s1,s2);
}
};
这是在网上找到的动态规划解法,学习下:
class Solution {
public:
bool isScramble(string s1, string s2) {
int len=s1.size();
bool dp[100][100][100]={false};
for (int i=len-1;i>=0;i--)
for (int j=len-1;j>=0;j--) {
dp[i][j][1]=(s1[i]==s2[j]);
for (int l=2;i+l<=len && j+l<=len;l++) {
for (int n=1;n<l;n++) {
dp[i][j][l]|=dp[i][j][n]&&dp[i+n][j+n][l-n];
dp[i][j][l]|=dp[i][j+l-n][n]&&dp[i+n][j][l-n];
}
}
}
return dp[0][0][len];
}
};