LeetCode-Scramble String

class Solution {
public:
    bool isScramble(string s1, string s2) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        //f[len][i][j]表示长度为len的以s1[i]开头的字串和以s2[j]开头的字串是否互为scrambleString
        if (s1.size() != s2.size())
        {
            return false;
        }
        for (size_t i = 0; i < s1.size(); ++i)
        {
            for (size_t j = 0; j < s2.size(); ++j)
            {
                f[1][i][j] = s1[i] == s2[j];
            }
        }
        for (size_t len = 2; len <= s1.size(); ++len)
        {
            for (size_t s1beg = 0; s1beg < s1.size(); ++s1beg)
            {
                size_t s1end = s1beg + len - 1;
                if (s1end >= s1.size())
                {
                    break;
                }
                for (size_t s2beg = 0; s2beg < s2.size(); ++s2beg)
                {
                    size_t s2end = s2beg + len - 1;
                    if (s2end >= s2.size())
                    {
                        break;
                    }
                    for (size_t s1mid = s1beg; s1mid < s1end; ++s1mid)
                    {
                        size_t leftSize = s1mid - s1beg + 1;
                        size_t rightSize = len - leftSize;
                        size_t s2mid = s2beg + leftSize - 1;
                        bool res1 = f[leftSize][s1beg][s2beg] && f[rightSize][s1mid + 1][s2mid + 1];
                        s2mid = s2end -leftSize;
                        bool res2 = f[leftSize][s1beg][s2mid + 1] && f[rightSize][s1mid + 1][s2beg];
                        f[len][s1beg][s2beg] = res1 || res2;
                        if (f[len][s1beg][s2beg])
                        {
                            break;
                        }
                    }
                }
            }
        }
        return f[s1.size()][0][0];
    }
private:
    bool f[100][100][100];
};

参考:http://www.cnblogs.com/remlostime/archive/2012/11/19/2778108.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值