1. 程式人生 > >leetcode 87 scramble string

leetcode 87 scramble string

開始的想法:暴力模擬

直接模擬,題目的意思是根節點下的兩個孩子可以交換,就遞迴模擬。然而後面發現根節點的位置似乎並不是固定的,故失敗。
我的程式碼:錯誤程式碼

#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;
    }
};