最先看到这一题,直觉的解法就是len从1到s1.size()-1,递归调用比較s1和s2长度为len的子串是否相等。以及剩余部分是否相等。

将s1分成s1[len + rest],分别比較s2[len + rest]和s2[rest + len]

代码例如以下:

    bool isScramble(string s1, string s2) {
return find(s1, s2);
} bool find(string s1, string s2) {
if (s1.compare(s2) == 0) return true;
for (int i = 1; i < s1.size(); i++)
{
if (find(s1.substr(0, i), s2.substr(0,i)) && find(s1.substr(i), s2.substr(i)))
return true;
if (find(s1.substr(0, i), s2.substr(s2.size() - i)) && find(s1.substr(i), s2.substr(0, s2.size() - i)))
return true;
}
return false;
}

是一个TLE的算法

改进点1:在find中查看s1和s2是否字母同样,假设不同。返回false

代码例如以下:

    bool isScramble(string s1, string s2) {
return find(s1, s2);
} bool find(string s1, string s2) {
if (!haveSameChar(s1, s2)) return false;
if (s1.compare(s2) == 0) return true;
for (int i = 1; i < s1.size(); i++)
{
if (find(s1.substr(0, i), s2.substr(0,i)) && find(s1.substr(i), s2.substr(i)))
return true;
if (find(s1.substr(0, i), s2.substr(s2.size() - i)) && find(s1.substr(i), s2.substr(0, s2.size() - i)))
return true;
}
return false;
} bool haveSameChar(string& s1, string& s2)
{
int chars[26] = {0};
for (int i = 0; i < s1.size(); i++)
{
chars[s1[i] - 'a'] ++;
}
for (int i = 0; i < s2.size(); i++)
{
if (chars[s2[i] - 'a'] == 0) return false;
chars[s2[i] - 'a'] --;
}
return true;
}

改进点2:存储状态,将问题转换为三维DP

dp(i, j, l):s1[i...i+l]和s2[j...j+l]是否满足要求

dp(i, j, l) = dp(i, j, k) && dp(i + k, j + k, l - k) || dp(i, j + l - k, k) && dp(i + k, j, l - k)

    vector<vector<vector<int>>> dp;
bool isScramble(string s1, string s2) {
int size = s1.size();
dp = vector<vector<vector<int>> > (size, vector<vector<int>>(size, vector<int>(size + 1)));
return find(s1, s2, 0, 0, size);
} bool find(string & s1, string & s2, int l1, int l2, int length)
{
if (dp[l1][l2][length] != 0)
return dp[l1][l2][length] == 1;
dp[l1][l2][length] = -1;
if (length == 1)
dp[l1][l2][length] = ((s1[l1] == s2[l2]) ? 1 : -1);
for (int len = 1; len < length; len++)
{
if (find(s1, s2, l1, l2, len) && find(s1, s2, l1 + len, l2 + len, length - len))
{
dp[l1][l2][length] = 1;
break;
}
if (find(s1, s2, l1, l2 + length - len, len) && find(s1, s2, l1 + len, l2, length - len))
{
dp[l1][l2][length] = 1;
break;
}
}
return dp[l1][l2][length] == 1;
}

Submission Details [leetcode] 算法的改进的更多相关文章

  1. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法

    http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  2. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法

    http://blog.csdn.net/pipisorry/article/details/48901217 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  3. LeetCode算法题-Repeated Substring Pattern(Java实现)

    这是悦乐书的第236次更新,第249篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第103题(顺位题号是459).给定非空字符串检查是否可以通过获取它的子字符串并将子字符 ...

  4. ISAP算法对 Dinic算法的改进

    ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...

  5. leetcode算法: Find Bottom Left Tree Value

    leetcode算法: Find Bottom Left Tree ValueGiven a binary tree, find the leftmost value in the last row ...

  6. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  7. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  8. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

  9. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

随机推荐

  1. 李洪强和你一起学习前端之(8)CSS复习

    今天是2017年3月24日周五 每一天都是余生当中最好的一天,珍惜当下. CSS基础复习 1 复习 1.1Css第一天 css层叠样式表 基础选择器 标签选择器 p{属性: 值;} 类选择器 .自定义 ...

  2. c++ friend 遇到 namespace 无法访问 private 成员的问题

    相关的文章(比较有意思,记录一下):http://www.cnblogs.com/lx20030303/archive/2012/09/21/2696258.html 先看例子.如下. 尝试编译的话, ...

  3. Github上fork项目后与原项目保持同步

    **步骤** 假设来源为 `https://github.com/_original/_project.git` fork 项目为  `https://github.com/_your/_projec ...

  4. linux2.4中netfilter_nat_alg机制分析--以FTP流程为例,分析NAT和ALG

    以FTP流程为例,分析NAT和ALG 网络环境: ×5+6=1286) 创建×5+6=1286),更新skb的应用层信息(这里应用层信息还是×5+6=1286) 创建×5+6=1286) 创建×5+6 ...

  5. python zlib压缩存储到mysql列

    数据太大压缩存储,可以使用zlib中的压缩函数,代码如下: import ujson import MySQLdb import zlib import base64 kwargs = { 'host ...

  6. Switch选择语句能否作用在String【字符串】上,也就是能否这么写:Switch(一个字符串变量)?

    Switch选择语句能否作用在String[字符串]上,也就是能否这么写:Switch(一个字符串变量)? 解答:不可以,只能处理int,byte,short,char,(其实是只能处理int,其它三 ...

  7. MATLAB中的文件类型总结

    %   ***.m文件 : 脚本文件或者函数文件或者:%   ***.mat文件:数据存储文件(二进制文件,可以ASCII码形式保存和加载,%                类似于单行EXCEL表格) ...

  8. retrival and clustering : week 4 GMM & EM 笔记

    华盛顿大学 机器学习 笔记. k-means的局限性 k-means 是一种硬分类(hard assignment)方法,例如对于文档分类问题,k-means会精确地指定某一文档归类到某一个主题,但很 ...

  9. java和C#异常处理的差异

    Java异常处理和C#非常相似,不过Java中支持强制异常处理方式, 一旦方法加入了throws关键字,那么调用这个方法的类就必须加上try和catch进行异常处理, 如果不处理(没有try catc ...

  10. js事件处理函数中return的作用

    这里面的return含有一些细节知识: 例如:onClick='return add_onclick()'与 onClick='add_onclick()'的区别 JAVASCRIPT在事件中调用函数 ...