[LeetCode] 87. Scramble String 爬行字符串
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.
Example 1:
- Input: s1 = "great", s2 = "rgeat"
- Output: true
Example 2:
- Input: s1 = "abcde", s2 = "caebd"
- Output: false
一种爬行字符串,就是说假如把一个字符串当做一个二叉树的根,然后它的非空子字符串是它的子节点,然后交换某个子字符串的两个子节点,重新爬行回去形成一个新的字符串,这个新字符串和原来的字符串互为爬行字符串。
解法1: 递归Recursion
解法2: 动态规划Dynamic Programming
Java:
- public class Solution {
- public boolean isScramble(String s1, String s2) {
- if (s1.equals(s2)) return true;
- int[] letters = new int[26];
- for (int i=0; i<s1.length(); i++) {
- letters[s1.charAt(i)-'a']++;
- letters[s2.charAt(i)-'a']--;
- }
- for (int i=0; i<26; i++) if (letters[i]!=0) return false;
- for (int i=1; i<s1.length(); i++) {
- if (isScramble(s1.substring(0,i), s2.substring(0,i))
- && isScramble(s1.substring(i), s2.substring(i))) return true;
- if (isScramble(s1.substring(0,i), s2.substring(s2.length()-i))
- && isScramble(s1.substring(i), s2.substring(0,s2.length()-i))) return true;
- }
- return false;
- }
- }
Python:
- # Time: O(n^4)
- # Space: O(n^3)
- class Solution(object):
- # @return a boolean
- def isScramble(self, s1, s2):
- if not s1 or not s2 or len(s1) != len(s2):
- return False
- if s1 == s2:
- return True
- result = [[[False for j in xrange(len(s2))] for i in xrange(len(s1))] for n in xrange(len(s1) + 1)]
- for i in xrange(len(s1)):
- for j in xrange(len(s2)):
- if s1[i] == s2[j]:
- result[1][i][j] = True
- for n in xrange(2, len(s1) + 1):
- for i in xrange(len(s1) - n + 1):
- for j in xrange(len(s2) - n + 1):
- for k in xrange(1, n):
- if result[k][i][j] and result[n - k][i + k][j + k] or\
- result[k][i][j + n - k] and result[n - k][i + k][j]:
- result[n][i][j] = True
- break
- return result[n][0][0]
C++: Recursion
- 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']--;
- }
- 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;
- }
- };
C++: Recursion
- class Solution {
- public:
- bool isScramble(string s1, string s2) {
- if (s1.size() != s2.size()) return false;
- if (s1 == s2) return true;
- string str1 = s1, str2 = s2;
- sort(str1.begin(), str1.end());
- sort(str2.begin(), str2.end());
- if (str1 != str2) return false;
- for (int i = 1; i < s1.size(); ++i) {
- string s11 = s1.substr(0, i);
- string s12 = s1.substr(i);
- string s21 = s2.substr(0, i);
- string s22 = s2.substr(i);
- if (isScramble(s11, s21) && isScramble(s12, s22)) return true;
- s21 = s2.substr(s1.size() - i);
- s22 = s2.substr(0, s1.size() - i);
- if (isScramble(s11, s21) && isScramble(s12, s22)) return true;
- }
- return false;
- }
- };
C++: DP
- class Solution {
- public:
- bool isScramble(string s1, string s2) {
- if (s1.size() != s2.size()) return false;
- if (s1 == s2) return true;
- int n = s1.size();
- vector<vector<vector<bool> > > dp (n, vector<vector<bool> >(n, vector<bool>(n + 1, false)));
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- dp[i][j][1] = s1[i] == s2[j];
- }
- }
- for (int len = 2; len <= n; ++len) {
- for (int i = 0; i <= n - len; ++i) {
- for (int j = 0; j <= n - len; ++j) {
- for (int k = 1; k < len; ++k) {
- if ((dp[i][j][k] && dp[i + k][j + k][len - k]) || (dp[i + k][j][len - k] && dp[i][j + len - k][k])) {
- dp[i][j][len] = true;
- }
- }
- }
- }
- }
- return dp[0][0][n];
- }
- };
C++:
- class Solution {
- public:
- bool isScramble(string s1, string s2) {
- if (s1.size() != s2.size()) return false;
- if (s1 == s2) return true;
- int n = s1.size();
- vector<vector<vector<bool> > > dp (n, vector<vector<bool> >(n, vector<bool>(n + 1, false)));
- for (int i = n - 1; i >= 0; --i) {
- for (int j = n - 1; j >= 0; --j) {
- for (int k = 1; k <= n - max(i, j); ++k) {
- if (s1.substr(i, k) == s2.substr(j, k)) {
- dp[i][j][k] = true;
- } else {
- for (int t = 1; t < k; ++t) {
- if ((dp[i][j][t] && dp[i + t][j + t][k - t]) || (dp[i][j + k - t][t] && dp[i + t][j][k - t])) {
- dp[i][j][k] = true;
- break;
- }
- }
- }
- }
- }
- }
- return dp[0][0][n];
- }
- };
All LeetCode Questions List 题目汇总
[LeetCode] 87. Scramble String 爬行字符串的更多相关文章
- [LeetCode] 87. Scramble String 搅乱字符串
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 ...
- [LintCode] Scramble String 爬行字符串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- [leetcode] 87. Scramble String (Hard)
题意: 判断两个字符串是否互为Scramble字符串,而互为Scramble字符串的定义: 字符串看作是父节点,从字符串某一处切开,生成的两个子串分别是父串的左右子树,再对切开生成的两个子串继续切开, ...
- [LeetCode] Scramble String 爬行字符串
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 ...
- Leetcode#87 Scramble String
原题地址 两个字符串满足什么条件才称得上是scramble的呢? 如果s1和s2的长度等于1,显然只有s1=s2时才是scramble关系. 如果s1和s2的长度大于1,那么就对s1和s2进行分割,划 ...
- 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
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
随机推荐
- java调用c++库
c++ 写的库 jni封装一层 才可以给 java调用
- word2vec中的subsampling
http://d0evi1.com/word2vec-subsampling/ 为了度量这种罕见词与高频词间存在不平衡现象,我们使用一个简单的subsampling方法:训练集中的每个词wiwi,以下 ...
- 在Windows10系统下安装Oracle 11g数据库
在Windows10系统下安装Oracle 11g数据库 https://blog.csdn.net/wei1992_6/article/details/60054727
- wordpress调用自定义菜单
wordpress要调用自定义菜单首先要注册菜单,将代码添加到主题文件夹下的function.php中,比如wordpress自带主题2019的定义如下 // This theme uses wp_n ...
- cookie插件|jq-cookie.js|使用详解
1.设置一二级域名共用的cookie:设置domain为一级域名,可一.二级域名共用的cookie $.cookie('f_city','北京|101010100|,锦州|101070701|',{e ...
- 笨办法学Python
打印:%r%r 与 %s 的区别就好比 repr() 函数处理对象与 str() 函数处理对象的差别.%s => str(),比较智能%r => repr(),处理较为简单和直接 from ...
- 洛谷 P1908 逆序对 题解
每日一题 day43 打卡 Analysis 因为数据规模,所以我们需要对其进行离散化,新创一个数组a里面来放在我们的初始序列中在这个位置上的数是第几大的这里还要用一个小技巧排序,关于离散化的技巧我们 ...
- 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信
https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient { public p ...
- Connection to newtaotao failed. [08001] Could not create connection to database
jdbc.url=jdbc:mysql://localhost:3306/newtaotao?serverTimezone=UTC&characterEncoding=utf-8 数据库是5. ...
- Go-Json操作
/** * @Author: jadeshu * @Description: * @File: main * @Version: 1.0.0 * @Date: 2019/11/7 2:33 */ pa ...