###题目

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

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

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

我们将 "rgtae” 称作 "great" 的一个扰乱字符串。给出两个长度相等的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。

  • 输入: s1 = "great", s2 = "rgeat"
  • 输出: true
  • 输入: s1 = "abcde", s2 = "caebd"
  • 输出: false

###思路

这样来进行理解,给定的两个字符串s1和s2,若如果s1和s2长度不一样,那么两者不为扰动字符串,如果长度一样,在进行判断,首先字符串s1能够划分为s1_1、s1_2 。同理那么,s2可以划分成s2_1、s2_2,现在出现了两种情况:

  • 没发生扰动,那么s1_1=s2_1、s1_2=s2_2。
  • 发生了扰动,那么s1_1=s2_2、s1_2=s2_1.

那么只要两个字符串分割而成的子字符串之间满足上面两种情况中的任意一种,那么就可以认为它们两是扰动字符串,4个互为扰动字符串的字符串合并而来的两个字符串肯定也是互为扰动字符串。

我们建立dp矩阵,

表示从s1的i开始的长度为l的字符串是否和s2的j开始的长度为l的字符串互为扰动字符串。

转移方程为

前后两个分别代表了两种情况,满足其一就可以了。

初始情况为长度是1的子串,此时只有相等才能变过去,所以相等为true,不相等为false。

###code

class Solution {public:bool isScramble(string s1, string s2) {if(s1.size()!=s2.size())return false;int l=s1.size();vector<vector<vector<int>>>dp(l,vector<vector<int>>(l,vector<int>(l+1,0)));for(int i=0;i<l;++i)//长度为1的情况{for(int j=0;j<l;++j)dp[i][j][1]= s1[i]==s2[j] ?1:0;}for(int len=2;len<=l;++len)//遍历2-n的长度{for(int s1_start=0;s1_start<=l-len;++s1_start){for(int s2_start=0;s2_start<=l-len;++s2_start){for(int p_len=1;p_len<len;++p_len)//要分为两个非空子字符串{//第一种情况if(dp[s1_start][s2_start][p_len]&&dp[s1_start+p_len][s2_start+p_len][len-p_len]){dp[s1_start][s2_start][len]=1;break;}//第二种情况if(dp[s1_start][s2_start+len-p_len][p_len]&&dp[s1_start+p_len][s2_start][len-p_len]){dp[s1_start][s2_start][len]=1;break;}}}}}return dp[0][0][l];}
};

###思路

看到别人修改成了递归版本,看起来舒服多了,也容易理解。

###代码

class Solution {public:bool isScramble(string s1, string s2) {if (s1.size() != s2.size())return false;if (s1 == s2) return true;string ss1(s1);string ss2(s2);sort(ss1.begin(), ss1.end());sort(ss2.begin(), ss2.end());if (ss1 != ss2)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()), s2.substr(i, s2.size()))) {return true;}//第二种情况if (isScramble(s1.substr(0, i), s2.substr(s2.size() - i, i))&& isScramble(s1.substr(i, s1.size()), s2.substr(0, s2.size() - i))) {return true;}}return false;}
};

cif判断字符串相等_leetcode 86 扰乱字符串(c++)相关推荐

  1. jsp判断字符串相等_leetcode 86 扰乱字符串(c++)

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

  2. LeetCode 86分割链表87扰乱字符串

    微信搜一搜:bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打卡群,欢迎 ...

  3. leetcode 87. 扰乱字符串(dp)

    使用下面描述的算法可以扰乱字符串 s 得到字符串 t : 如果字符串的长度为 1 ,算法停止 如果字符串的长度 > 1 ,执行下述步骤: 在一个随机下标处将字符串分割成两个非空的子字符串.即,如 ...

  4. LeetCode 87. 扰乱字符串(记忆化递归 / DP)

    文章目录 1. 题目 2. 解题 2.1 记忆化递归 2.2 动态规划 1. 题目 给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树. 下图是字符串 s1 = &q ...

  5. LeetCode 87. 扰乱字符串(递归)

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

  6. 1008day1:列表-字符串基础知识、正则提取字符串小数、python数据类型、判断为假的方法、格式判断if elif elif else、字符串遍、计算器、提取str字母、斐波那契数列、水仙花数

    文章目录 一.提取字符串里面的小数:正则 二.Python数据类型 三.== 字符串:str基础知识 == 四.整型及浮点型 五.判断为假的方法 六.判断格式 七.循环:字符串遍历 六.循环1~100 ...

  7. C语言---写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

    题目: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串. #include <string.h> #include <stdio.h> void left_re ...

  8. 两种方法判断一个字符串是否为另外一个字符串旋转之后的字符串。(C语言)...

    例如:给定s1 = AABCD和s2 = BCDAA,返回1 给定s1 = abcd和s2 = ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 第一种: ...

  9. python如何判断字符串是否包含某些汉字_Python如何判断一个字符串是否包含指定子字符串...

    Python如何判断一个字符串是否包含指定字符串?本篇文章就给大家介绍Python判断一个字符串是否包含指定子串的3种方法.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 程序员在字 ...

最新文章

  1. C++中#error/assert/static_assert的区别及使用
  2. miui 8.5 android,小米MIUI 8.5稳定版更新来了:直达服务功能秒开应用
  3. 谷歌开源3D舞蹈生成模型FACT,舞姿清奇!
  4. aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单
  5. Springmvc接收json数据的4种方式
  6. 324. Wiggle Sort II
  7. 18-elasticsearch集群健康为黄色
  8. jboss eap6.1(4)(部署应用)
  9. Windows Server2012 R2中安装SQL Server2008
  10. 视频教程-WPF MVVM 编程模式/框架 基础+提高 项目开发实战视频教程-.NET
  11. linux vi带 替换,vim替换命令_Linux vi/vim替换命令使用集锦
  12. js读取excel时间格式转换
  13. python删除数组元素_如何删除numpy数组中的特定元素
  14. 酬乐天扬州初逢席上见赠 唐 · 刘禹锡
  15. Clojure 学习入门(18)—— 数据类型
  16. 电商平台分析平台----需求六:实时统计之黑名单机制
  17. 睿联技术在创业板过会:收入依赖摄像机单机,计划募资11亿元
  18. Stream中map和flatmap的区别,一看就懂
  19. excel的vlookup如果是空白就不显示0,而是显示空白
  20. 淘宝搜索展现原理,店铺商品排名较低怎么办

热门文章

  1. java中的final的使用
  2. 原生的文件上傳和下载
  3. 烂大街的常用Linux命令、工具
  4. 电子政务方向:We7.Cloud政府云门户
  5. 高通Android平台下关于display部分的几个关键问题
  6. [转载]在ASP.NET中使用Microsoft Word文档
  7. 19、SOAP安装,运用与比对结果解释
  8. nginx文件下载服务器简单配置
  9. null 和{}的那点事
  10. MAC OS 10.12 安装任意来源应用