87. Scramble String (String; DP)
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great":
great
/ \
gr eat
/ \ / \
g r e at
/ \
a t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".
rgeat
/ \
rg eat
/ \ / \
r g e at
/ \
a t
We say that "rgeat" is a scrambled string of "great".
Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".
rgtae
/ \
rg tae
/ \ / \
r g ta e
/ \
t a
We say that "rgtae" is a scrambled string of "great".
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.
思路:对付复杂问题的方法是从简单的特例来思考。简单情况:
- 如果字符串长度为1,那么必须两个字符串完全相同;
- 如果字符串长度为2,例如s1='ab',则s2='ab'或s2='ba'才行
- 如果字符串任意长度,那么可以把s1分为a1, b1两部分,s2分为a2,b2两部分。需要满足:((a1=a2)&&(b1=b2)) || ((a1=b2)&&(a2=b1)) =>可用递归
class Solution {
public:
bool isScramble(string s1, string s2) {
if(s1 == s2) return true;
for(int isep = ; isep < s1.size(); ++ isep) { //traverse split pos
string seg11 = s1.substr(,isep);
string seg12 = s1.substr(isep);
//see if a1=a2 &&b1=b2 is ok
string seg21 = s2.substr(,isep);
string seg22 = s2.substr(isep);
if(isScramble(seg11,seg21) && isScramble(seg12,seg22)) return true;
//see if a1=b2 &&a2=b1 is ok
seg21 = s2.substr(s2.size() - isep); //从后截取isep长度
seg22 = s2.substr(,s2.size() - isep);
if(isScramble(seg11,seg21) && isScramble(seg12,seg22)) return true;
}
return false;
}
};
Result: Time Limit Exceeded
思路II: 动态规划。三维状态dp[i][j][k],前两维分别表示s1和s2的下标起始位置,k表示子串的长度。dp[i][j][k]=true表示s1(i, i+k-1)和s2(j, j+k-1)是scramble。
状态转移方程:if(dp[i][j][split] && dp[i+split][j+split][k-split] || dp[i][j+k-split][split] && dp[i+split][j][k-split]) dp[i][j][k]=true;
因为在状态转移方程中k又要分割成更小的值,所以必须已知小值,k从小到大遍历。
class Solution {
public:
bool isScramble(string s1, string s2) {
int len = s1.length();
if(len==) return true;
if(s1 == s2) return true;
//初始状态
vector<vector<vector<bool>>> dp(len, vector<vector<bool>>(len, vector<bool>(len+, false) ) );
for (int i = ; i < len; ++i)
{
for (int j = ; j < len; ++j)
{
dp[i][j][] = s1[i]==s2[j];
}
}
//状态转移
for(int k = ; k <= len; k++) //从较短的子串开始分析,为了状态转方程
{
for(int s1Pointer = ; s1Pointer+k- < len; s1Pointer++)
{
for(int s2Pointer = ; s2Pointer+k- < len; s2Pointer++)
{
for(int split = ; split < k; split++) //levelSize长度的任意一种分割
{
if ((dp[s1Pointer][s2Pointer][split] && dp[s1Pointer+split][s2Pointer+split][k-split]) ||
(dp[s1Pointer][s2Pointer+k-split][split] && dp[s1Pointer+split][s2Pointer][k-split]))
{
dp[s1Pointer][s2Pointer][k] = true;
break;
};
}
}
}
}
return dp[][][len];
}
};
87. Scramble String (String; DP)的更多相关文章
- [LeetCode] 87. Scramble String 搅乱字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 87. Scramble String
题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...
- [leetcode]87. Scramble String字符串树形颠倒匹配
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 87. Scramble String *HARD* 动态规划
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- [LeetCode] 87. Scramble String 爬行字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 87. Scramble String (Java)
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- leetcode@ [87] Scramble String (Dynamic Programming)
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 【LeetCode】87. Scramble String
题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...
- 【一天一道LeetCode】#87. Scramble String
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
随机推荐
- R语言学习——向量,矩阵
在R中,基本的数据结构有:向量,矩阵,数组,数据框,列表,因子,函数等. 向量:一系列同类型的有序元素构成. 向量是一维结构. 向量是R最简单的数据结构,在R中没有标量. 标量被看成1个元素的向量. ...
- 用几分钟了解R语言入门知识
第一篇——用几分钟了解R语言入门知识 第二篇——用几分钟了解R语言入门知识(续) 关于数据分析学习笔记的计划(以及目录)
- shell 11函数
函数定义 function 方法名(){ command return int; } 注意:function可加可不加 #shell #!/bin/sh function fun1(){ echo & ...
- 一篇文章让你入门Shell !
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- Scrapy-下载中间件
下载中间件 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和response的一个轻量.底层的系统 编写您自己的下载器中间 ...
- ORACLE V$lock视图TYPE,ID1,ID2取值的含义
在oracle v$lock视图中,下面对type,ID1,ID2三个列的具体含义说明下: TYPE 有TM,TX两种类型,TX为行级锁,事物锁,TM锁为表级锁 TYPE ID1 ID2 TM 被 ...
- linux read 系统调用剖析
https://www.ibm.com/developerworks/cn/linux/l-cn-read/ MT注:原文图1与Understanding the Linux Kernel, 3rd ...
- gz文件最后四位检测
[root@node-0 ~]# ll -rw-r--r-- 1 root root 24048 Nov 29 11:29 install.log 文件大小为24048 [root@node-0 ~ ...
- Solr Facet 搜索时,facet.missing = true 的真正含义
Solr的WiKI原文是如下解释: facet.missing Set to "true" this param indicates that in addition to the ...
- WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException
Hadoop 2.7.4 The reason is this: originally, DataStreamer::closeResponder always prints a warning ab ...