leetcode 87 Scramble String(c++,beat 80%~100%)

题解

符号:

  • S_(i-j):表示字符串s下标从i到j的字串。

思路
其实没什么规律,就是暴力枚举交换轴,然后每次有交换与不交换两种情况,递归判断是否可行。唯一剪枝就是假如S1_(i,j)=S2_(k,l),则他们所包含的字母的集合是相同的,如果不同,则不用再继续递归下去。
代码

class Solution {
public:
    int *sum1,*sum2;
    bool dfs(int l1,int r1,int l2,int r2,string &s1,string &s2){
        if(sum1[r1+1]-sum1[l1]!=sum2[r2+1]-sum2[l2]) return false;
        if(l1==r1){
            return s1[l1]==s2[l2];
        }
        int res =0;
        for(int i=0;i<r1-l1+1-1;i++){
            res|=dfs(l1,l1+i,l2,l2+i,s1,s2)&&dfs(l1+i+1,r1,l2+i+1,r2,s1,s2);
            if(res) break;
            res|=dfs(l1,l1+i,r2-i,r2,s1,s2)&&dfs(l1+i+1,r1,l2,r2-i-1,s1,s2);
            if(res) break;
        }
        return res;
    }
    bool isScramble(string s1, string s2) {
        
        if(s1.size()==0) return true;
        sum1= new int[s1.size()+1];
        sum2 = new int[s2.size()+1];
        sum1[0]=sum2[0]=0; 
        for(int i=0;i< s1.size();i++){
            sum1[i+1]=(sum1[i]+((s1[i]*s1[i])^123563));
            sum2[i+1]=(sum2[i]+((s2[i]*s2[i])^123563));
        }
        return dfs(0,s1.size()-1,0,s2.size()-1,s1,s2);
        return false;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值