leetcode 87 scramble string
阿新 • • 發佈:2018-12-19
開始的想法:暴力模擬
直接模擬,題目的意思是根節點下的兩個孩子可以交換,就遞迴模擬。然而後面發現根節點的位置似乎並不是固定的,故失敗。
我的程式碼:錯誤程式碼
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1 == s2)
return true;
return judgeScramble(0,s1.length()-1,s1,s2);
}
bool judgeScramble(int from,int to,string str,string pattern)
{
cout<<from<<" "<<to<<" "<<str.size()<<endl;
int mid = (from+to-1)/2;//aim root
//exchange its two children
string newstr = str.substr(0,from)+str.substr(mid+1,to-mid)+str.substr(from,mid+1-from)+str.substr(to+1);
cout<<newstr<<endl;
if(newstr == pattern)
return true;
bool s1 = false,s2 = false,s3 = false,s4 = false;
if(mid-from>=1)
{
s1 = judgeScramble (from,from+to-mid-1,newstr,pattern);
s2 = judgeScramble(from,mid,str,pattern);
}
if(s1||s2)
return true;
if(to-mid>1)
{
s3 = judgeScramble(from+to-mid,to,newstr,pattern);
s4 = judgeScramble(mid+1,to,str,pattern);
}
return s3||s4;
}
};
int main(void)
{
Solution s;
cout<<s.isScramble("abb","bab")<<endl;
return 0;
}
動態規劃
既然根節點可以交換,那就去反覆列舉根節點(根節點可以從第一個點到最後一個,只要保證孩子的長度大於等於1即可),然後判斷如果發生交換時兩個子串是否符合條件,如果沒有發生交換時兩個子串是否滿足條件。只要有一個滿足條件即可。
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1==s2)
return true;
int len = s1.length();
int count[26] = {0};
for(int i=0; i<len; i++)
{
count[s1[i]-'a']++;
count[s2[i]-'a']--;
}
for(int i=0; i<26; i++)
{
if(count[i]!=0)
return false;
}
for(int i=1; i<=len-1; i++)
{
if( isScramble(s1.substr(0,i), s2.substr(0,i)) && isScramble(s1.substr(i), s2.substr(i)))
return true;
if( isScramble(s1.substr(0,i), s2.substr(len-i)) && isScramble(s1.substr(i), s2.substr(0,len-i)))
return true;
}
return false;
}
};