【字符串】scramble string

相当于按这种二分(也不算找中心分啦)的结构,结构之间可以互换顺序,结构之内(由于又可以二分)也可以互换顺序。问你两个字符串互不互为这种关系。

大致思路:

刚开始没反应过来——其实这也是求“字符串的全排列”是否对应——>看各字母出现的次数

只不过,这涉及到二叉树的结构,很明显又让人知道要——递归

所以,就是遍历i来分割出不同的二叉树结构,然后递归地来看两个子树是不是满足全排列对应。是的,对每一步,只需要看两个子树,两个子树再来分就是递归的事了。

由于子树之间、之内可以互换,之内的不用考虑了递归来做,只需要考虑之间的互换就行了。所以对应关系其实就两种:字符串一模一样 OR 字符串根据i来划分为两部分,而这两部分的顺序不同,如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;
    }
};

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值