[문자열] 스크램블 문자열

끊임 당량 (이들은 반 수 있으므로)를 순차적으로 교환 할 수있는 구조로, 구조가 구조 내에서 서열들 사이에서 교환 될 수있다 (또한 중앙 점이 발견되지 않음). 두 캐릭터가 서로에게 관계를 요구하지 않고.

일반적인 아이디어 :

첫째 그는 반응하지 않았다에서 - 사실,이 또한 노력하고있다 "전체 배열 문자열은"해당 -> 각 문자가 나타나는 횟수를 확인합니다 .

그러나,이 관련 이진 트리의 구조 - 당신이 알고 싶어하게 분명하다 재귀 .

그러므로 나는 다른 이진 트리를 분리하고 재귀 개의 전체 어레이에 대응하는 서브 트리 만족하지 보이기 이송된다. 예, 모든 단계는 단지 두 개의 하위 서브 트리 다시 재귀 것들 두 개의 하위 트리 봐.

때문에 하위 트리 사이에 상호 교환 내 관계없이 재귀의 내부의 만 라인에 고려해야 할 사이에 스왑을 할 수 있습니다. 따라서, 실제로 두 가지 방식의 대응 관계 : 예 AB 및 BA와 같은 두 부분과 상이한 순서의 두 부분으로 또는 문자열 난 동일한 문자열

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