Leetcode 87.扰乱字符串
扰乱字符串
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。
下图是字符串 s1 = "great" 的一种可能的表示形式。

在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。
例如,如果我们挑选非叶节点 "gr" ,交换它的两个子节点,将会产生扰乱字符串 "rgeat" 。

我们将 "rgeat" 称作 "great" 的一个扰乱字符串。
同样地,如果我们继续将其节点 "eat" 和 "at" 进行交换,将会产生另一个新的扰乱字符串 "rgtae" 。

我们将 "rgtae" 称作 "great" 的一个扰乱字符串。
给出两个长度相等的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。
示例 1:
输入: s1 = "great", s2 = "rgeat"
输出: true
示例 2:
输入: s1 = "abcde", s2 = "caebd"
输出: false
【分析】
题意在于判断一个字符串是否为另一个字符串"乱序"得到,这种乱序采用的方式是将一个字符串从某个位置"割开",形成两个子串,然后对两个子串进行同样的"割开"操作,直到到达叶子节点,无法再分割。然后对非叶子节点的左右孩子节点进行交换,最后重新从左至右组合形成新的字符串,由于这个过程中存在字符位置的变化,因此,原来的字符串顺序可能会被打乱,当然也可能没有(同一个非叶子节点的左右孩子交换0次或偶数次,就无变化)。需要注意的点:
1、原字符串每次被割开的位置并不确定可能为[1,s.size()-1],所以必然需要遍历所有可能割开的位置;
2、原字符串从第i个位置被割开(i在区间[1,s.size()-1]),形成的两个子串s.substr(0,i)和s.substr(i,s.size()-i),如果这两个子串不全为空,则它们的母串(这里指原字符串)就是所谓的非叶子节点,这两个子串可以左右交换(按照二叉树的展开方式);对于两个子串,可继续割裂,直到形成叶子节点。
3、可以想见,原字符串对应的"乱序"串s1,定然满足如下规律:如果将"乱序"串同样从第i个位置割开,他同样可以形成两个子串,s1.substr(0,i)和s1.substr(i,s1.size()-i),并且满足:
s1.substr(0,i)是s.substr(0,i)的"乱序"且s1.substr(i,s1.size()-i)是s.substr(i,s.size()-i)的""乱序
或者(因为左右交换的原因)
s1.substr(0,i)是s.substr(s.size()-i)的"乱序"且s1.substr(i)是s.substr(0,s.size()-i)的"乱序"
4、如上分析,我们就可以将大问题分解成小问题,通过递归调用,便可以判断两个字符串是否互为"乱序",还需注意一个问题就是"剪枝"操作,二叉树形式分解,层次很深,每一层都应满足(3)中的两种可能之一,如果不满足便不再继续下一层,直接返回false,这便是一种剪枝操作,可以极大的提升效率。
5、"剪枝"约束,若两个字符串s1和s2互为"乱序",需满足s1和s2包含的字符及数量应完全相同,如果不同,则不可能构成"乱序",因此这个条件可作为剪枝条件;
6、两个工具:判断两个字符串是否包含完全相同的字母,用到了"哈希表";割裂形成子串用到STL函数:substr(i,n);表示获得字符串从第i个位置开始的n个字符,如果n空缺,默认为到字符串末尾。
class Solution{
public:
bool isScramble(string s1,string s2){
if(s1.size()!=s2.size()) return false;
if(s1==s2) return true;
vector<int> hash(26,0);
for(int i=0;i<s1.size();i++)
hash.at(s1[i]-'a')++;
for(int j=0;j<s2.size();j++)
hash.at(s2[j]-'a')--;
for(int k=0;k<26;k++){
if(hash.at(k)!=0)
return false;
}
for(int i=1;i<s1.size();i++){
if((isScramble(s1.substr(0,i),s2.substr(0,i))&&isScramble(s1.substr(i,s1.size()-i),s2.substr(i,s1.size()-i)))
||(isScramble(s1.substr(0,i),s2.substr(s1.size()-i))&& isScramble(s1.substr(i),s2.substr(0,s1.size()-i))))
return true;
}
return false;
}
};
Leetcode 87.扰乱字符串的更多相关文章
- Java实现 LeetCode 87 扰乱字符串
87. 扰乱字符串 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. grea ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- LeetCode(87):扰乱字符串
Hard! 题目描述: 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = "great" 的一种可能的表示形式. gr ...
- LeetCode 87,远看是字符串其实是搜索,你能做出来吗?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第54篇文章,我们一起来看LeetCode 87题,Scramble String(爬行字符串). 这题的官方难度 ...
- 【python】Leetcode每日一题-扰乱字符串
[python]Leetcode每日一题-扰乱字符串 [题目描述] 使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行 ...
- [Swift]LeetCode87. 扰乱字符串 | Scramble String
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 087 Scramble String 扰乱字符串
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树.下图是字符串s1 = "great"的一种可能的表示形式. great / \ ...
- C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
随机推荐
- VUE学习之计算属性computed
计算属性:computed 先看一下官网的说法 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="ex ...
- C# 相关概念
解决方案 在磁盘上由 .sln 文件表示,是一个或多个相关项目的容器. 例如,如果为 Python 应用程序编写 C++ 扩展,该 C++ 项目可以驻留在同一解决方案中. 解决方案还可以包含 Web ...
- 设计模式学习之代理模式(Proxy)
一.代理模式的初衷 不想让客户端直接访问具体实现接口,客户端不应该直接访问具体实现,一般会涉及到以下四个对象 业务接口:定义客户端访问的接口,是实现类和代理类都需要实现的 实现类:实现了业务接口,真正 ...
- 10步成为专业iOS开发者——新手向,从零起步
想在移动开发大餐中分一杯羹,体验最火最炫的技术?小伙子,很有眼光嘛 毫无疑问,移动开发在目前和未来几年内都会盛极一时.无数开发职位虚位以待.各大公司都在寻找各种层次的程序员——新手级.入门级.中级.老 ...
- Git学习笔记(2)-创建仓库
一.Git简介 1.Git是什么 Git是分布式版本控制系统 2.Git有什么特点 (1)Git是分布式的SCM,SVN是集中式的 (2)Git每个历史版本存储完整的文件,SVN存储文件差异 (3)G ...
- A8ERP权限管理系统
- [ SDOI 2006 ] 保安站岗
\(\\\) Description 给出一棵 \(n\) 个节点以 \(1\) 为根的树,一个节点的覆盖半径是 \(1\) ,点有点权 \(val_x\) . 选择一些点,使得点权和最小,同时每个节 ...
- 判断IE浏览器的类型以及提示信息(低版本浏览器不予显示)
//浏览器IE版本判断(function(window) { var theUA = window.navigator.userAgent.toLowerCase(); if ((theU ...
- python与arduino串口通讯对接opencv实现智能物品分拣
2018-05-0118:53:50 先上图: 再来视频: http://v.youku.com/v_show/id_XMzU3NzAwNzMyNA==.html?spm=a2hzp.8244740. ...
- android开发小内容
EditText弹出输入数字:android:inputType="phone"