最先看到这一题,直觉的解法就是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. Oracle之函数concat、lpad

    一.引言 程序测试需要生成大量的测试数据,且测试数据有主键,主键自增,于是决定用存储过程来实现,经过半天的查资料终于完成了,记录之,学习之 二.存储过程 格式: CREATE PROCEDURE re ...

  2. Oracle之sqlplus显示中文出现乱码

    解决办法: win+R快捷键>>--regedit>>HKEY_LOCL_MACHINE>>SOFTWARE>>ORALCE>>KEY_OR ...

  3. [转]C++ error C2011: “XXX”:“class”类型重定义

    http://blog.csdn.net/m_leonwang/article/details/27678219 尝试修复这个程序的错误: 点击下载源代码文件夹

  4. git branch --set-upstream hmyq/master master

    git branch --set-upstream hmyq/master master

  5. 第一百四十节,JavaScript,封装库--浏览器检测

    JavaScript,封装库--浏览器检测 在函数库编写一个,浏览器检测对象 /** sys浏览器检测对象,对象下有两个属性,liu_lan_qi属性和xi_tong属性 * liu_lan_qi属性 ...

  6. <!>贴图/音乐

    <img src=图片位址>贴图 <img src=图片位址 width=’180’>设定图片宽度 <img src=图片位址 height=’30’>设定图片高度 ...

  7. js 安全

    0x00 前言 在信息安全领域,可信系统(Trusted system)是一个让人心动的目标,它指的是一个通过实施特定的安全策略而达到一定可信程度的系统. 在计算机中,可信平台模块(Trusted P ...

  8. Material design之Views and Shadows

    Views and Shadows: elevation是构成控件阴影的基本属性.通过设置较高的Z值可以接受更大的阴影,阴影只能投射到Z=0的平面上. View Elevation 控件的Z值,是由两 ...

  9. 下载Ubuntu镜像

    Ubuntu最新桌面版:http://www.ubuntu.org.cn/download/desktop Ubuntu历史版本下载,只需要更改链接后面的版本号:http://releases.ubu ...

  10. 利用python输出000至999中间的数

    打造一个000-999的字典 ): : i = '+str(i) elif <=i and i<: i ='+str(i) else: i=str(i) with open('1.txt' ...