[leetcode]87. Scramble String
来源:互联网 发布:网络目标市场匹配题 编辑:程序博客网 时间:2024/06/11 11:50
题目链接:https://leetcode.com/problems/scramble-string/description/
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.
The basic idea is to divide s1(s2) into two substrings with length k and len-k and check if the two substrings s1[0..k-1] and s1[k, len-1] are the scrambles of s2[0..k-1] and s2[k,len-1] or s2[len-k, len-1] and s2[0..len-k-1] via recursion. The straigtforward recursion will be very slow due to many repeated recursive function calls. To speed up the recursion, we can use an unordered_map isScramblePair to save intermediate results. The key used here is s1+s2, but other keys are also possible (e.g. using indices)
(96ms)
class Solution {public: bool isScramble(string s1, string s2) { unordered_map<string,bool> isScramblePair; return dp_helper(isScramblePair,s1,s2); }private: bool dp_helper(unordered_map<string,bool>& isScramblePair,string s1,string s2) { int len=s1.size(); bool res=false; if(len==0) return true; else if(len==1) return s1==s2; else { // checked before, return intermediate result directly if(isScramblePair.count(s1+s2)) return isScramblePair[s1+s2]; if(s1==s2) res=true; else { for(int i=1;i<len && !res;i++) { //check if s1[0..k-1] and s1[k, len-1] are the scrambles of s2[0..k-1] and s2[k,len-1] res=res || (dp_helper(isScramblePair,s1.substr(0,i),s2.substr(0,i)) && dp_helper(isScramblePair,s1.substr(i,len-i),s2.substr(i,len-i))); //check if s1[0..k-1] and s1[k, len-1] are the scrambles of s2[len-k, len-1] and s2[0..len-k-1] res=res || (dp_helper(isScramblePair,s1.substr(0,i),s2.substr(len-i,i)) && dp_helper(isScramblePair,s1.substr(i,len-i),s2.substr(0,len-i))); } } //save the intermediate results return isScramblePair[s1+s2]=res; } }};
The recursive version has exponential complexity. To further improve the performance, we can use bottom-up DP, which is O(N^4) complexity. Here we build a table isS[len][i][j], which indicates whether s1[i..i+len-1] is a scramble of s2[j..j+len-1].
(22ms)
class Solution {public: bool isScramble(string s1, string s2) { int sSize=s1.size(),len; if(sSize==0) return true; if(sSize==1) return s1==s2; bool isS[sSize+1][sSize][sSize]={false}; for(int i=0;i<sSize;i++) for(int j=0;j<sSize;j++) isS[1][i][j]=s1[i]==s2[j]; for(len=2;len<=sSize;len++) for(int i=0;i<=sSize-len;i++) for(int j=0;j<=sSize-len;j++) { for(int k=1;k<len && !isS[len][i][j];k++) { isS[len][i][j]=isS[len][i][j] || (isS[k][i][j] && isS[len-k][i+k][j+k]); isS[len][i][j]=isS[len][i][j] || (isS[k][i+len-k][j] && isS[len-k][i][j+k]); } } return isS[sSize][0][0]; }};
(6ms)
class Solution {public: bool isScramble(string s1, string s2) { if(s1==s2) return true; int len=s1.length(); int count[26]={0}; for(int i=0;i<len;i++) { count[s1[i]-'a']++; count[s2[i]-'a']--; } // accelerate speed for(int i=0;i<26;i++) { if(count[i]!=0) return false; } for(int i=1;i<=len-1;i++) { if(isScramble(s1.substr(0,i),s2.substr(0,i)) && isScramble(s1.substr(i),s2.substr(i))) return true; if(isScramble(s1.substr(0,i),s2.substr(len-i)) && isScramble(s1.substr(i),s2.substr(0,len-i))) return true; } return false; }};
- LeetCode 87. Scramble String
- [Leetcode] 87. Scramble String
- LeetCode --- 87. Scramble String
- [leetcode] 87.Scramble String
- Leetcode 87. Scramble String
- Leetcode 87. Scramble String
- Leetcode:87. Scramble String
- leetcode.87. Scramble String
- Leetcode 87. Scramble String
- [LeetCode] 87. Scramble String
- leetcode-87. Scramble String
- [LeetCode]87. Scramble String
- [LeetCode]87.Scramble String
- [LeetCode] 87. Scramble String
- 【LeetCode】87. Scramble String
- [LeetCode]87. Scramble String
- [leetcode] 87. Scramble String
- Leetcode 87. Scramble String
- goto语句的七伤拳属性
- C
- 设计模式的应用场景(5)--单例模式
- os.popen()
- 在openwrt中设置mjpg_streamer开机自启动
- [leetcode]87. Scramble String
- IPython和IPython Notebook的安装和简单应用
- Java进阶(四十)Java类、变量、方法修饰符讲解 Java类修饰符
- 取随机数
- (八)事件主循环
- Java进阶(五十三)JAVA 注解机制
- C++函数调用机制
- jQuery 实现鼠标画框并对框内数据选中
- Java进阶(五十四)初识JAVA类加载机制