[文字列]スクランブル文字列

この半等価で(それらは半できるため)を順次交換することができる構造で、構造が構造内に、配列間で交換することができる(また、中央ポイントが見つかりません)。二つの文字列と、あなたは、この関係お互いに質問しません。

一般的な考え方:

最初に彼は反応しなかった-実際には、これも求めている「完全な配列の文字列は、」対応- >それぞれの文字が表示された回数を確認します

しかし、これはに関し、バイナリツリーの構造 - 、それはあなたが知っているたくなることは明らかである再帰を

したがって、私は異なる二進木を分離し、その後再帰的2つの完全な配列に対応するサブツリー満たされていないように見えるためにトラバースされます。はい、すべてのステップは、ちょうど2つのサブ木を見て、二つのサブサブツリーは再び再帰的なものです。

サブツリーの間で、交換可能な範囲内にかかわらず、実行する再帰の内側の、唯一の間のスワップがライン上で検討する必要があるため。実際にはこのため、対応関係二つの方法:私は二つの部分、およびそのようなABおよびBAのような異なる順序の2つの部分、に同一の文字列または文字列

ACコード:

class Solution {
public:
    bool isScramble(string s1, string s2) {
        if(s1==s2) //这里要写,剪枝。
            return true;
        //先看整体的各单词出现次数是否一致
        vector<int> v1(26,0);
        vector<int> v2(26,0);
        int len1=s1.size();
        int len2=s2.size();
        if(len1!=len2)
            return false;
        for(int i=0;i<len1;i++)
            v1[s1[i]-'a']++;
        for(int i=0;i<len2;i++)
            v2[s2[i]-'a']++;
        if(v1!=v2)
        {
            return false;
        }
        
        //接下来看是不是如题的分割方式也是呈这样的关系 (毕竟abc和cba不对)
        for(int i=1;i<=len1-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(len2-i)) && isScramble(s1.substr(i),s2.substr(0,len2-i)) )
                return true;
        }
        return false;
    }
};

 

 

 

おすすめ

転載: blog.csdn.net/m0_38033475/article/details/92407095