Submission Details [leetcode] 算法的改进
最先看到这一题,直觉的解法就是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] 算法的改进的更多相关文章
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
http://blog.csdn.net/pipisorry/article/details/48914067 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:基于hash的方法
http://blog.csdn.net/pipisorry/article/details/48901217 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- LeetCode算法题-Repeated Substring Pattern(Java实现)
这是悦乐书的第236次更新,第249篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第103题(顺位题号是459).给定非空字符串检查是否可以通过获取它的子字符串并将子字符 ...
- ISAP算法对 Dinic算法的改进
ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...
- leetcode算法: Find Bottom Left Tree Value
leetcode算法: Find Bottom Left Tree ValueGiven a binary tree, find the leftmost value in the last row ...
- LeetCode算法题-Subdomain Visit Count(Java实现)
这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...
- LeetCode算法题-Number of Lines To Write String(Java实现)
这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
随机推荐
- Apache服务器 403 Forbidden的几种错误原因小结!
403 Forbidden错误原因详解 403 - Forbidden(禁止访问),服务器拒绝请求 - forbidden request (matches a deny filter) => ...
- php服务器端与android客户端通信问题
http://www.oschina.net/question/616446_90760
- PAT006 Tree Traversals Again
题目: An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For exa ...
- HTML表单页面的运用
本章目标:掌握表单基本结构<form> 掌握各种表单元素 能理解post和get两种提交方式的区别 本章重点:掌握各种表单元素 本章难点:post和get两种提交方式的区别 一. H ...
- js事件循环机制(Event Loop)
javascript从诞生之日起就是一门 单线程的 非阻塞的 脚本语言,单线程意味着,javascript代码在执行的任何时候,都只有一个主线程来处理所有的任务,非阻塞靠的就是 event lo ...
- js 判断数组
这么基础的东西实在不应该再记录了,不过嘛,温故知新~就先从数据类型开始吧 js六大数据类型:number.string.object.Boolean.null.undefined string: 由单 ...
- Django admin 注册多个app
class game(models.Model): content = models.TextField() def __str__(self): return 'To game %s' % self ...
- Django之前端模板继承
在使用Django进行web开发时,往往会构造一个基础框架模板即base.html,而后在其子模板中对它所包含站点公用部分和定义块进行重载. 首先创建一个base.html,源码为: <!DOC ...
- Kotlin——高级篇(五):集合之常用操作符汇总
在上一篇文章Kotlin--高级篇(四):集合(Array.List.Set.Map)基础中讲解到了数组Array<T>.集合(List.Set.Map)的定义与初始化.但是由于篇幅的原因 ...
- 【文章阅读】详解MySQL数据类型
详解MySQL数据类型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8446246.html 注:对于MySQL的数据类型做了详细的讲解,这是我看过的最 ...