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

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 记忆化递归
      • 2.2 动态规划

1. 题目

给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。

下图是字符串 s1 = “great” 的一种可能的表示形式。

    great/    \gr    eat/ \    /  \
g   r  e   at/ \a   t

在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。

例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。

    rgeat/    \rg    eat/ \    /  \
r   g  e   at/ \a   t

我们将 "rgeat” 称作 “great” 的一个扰乱字符串。

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

    rgtae/    \rg    tae/ \    /  \
r   g  ta  e/ \t   a

我们将 "rgtae” 称作 “great” 的一个扰乱字符串。

给出两个长度相等的字符串 s1 和 s2,判断 s2 是否是 s1 的扰乱字符串。

示例 1:
输入: s1 = "great", s2 = "rgeat"
输出: true示例 2:
输入: s1 = "abcde", s2 = "caebd"
输出: false

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/scramble-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 记忆化递归

  • 按照长度 1 到 n-1 把 s1 , s2 切开,递归判断
  • 注意用哈希表记录下来一些已经得到的结果,否则超时195 / 285 个通过测试用例
class Solution {unordered_map<string,unordered_map<string,bool>> m;
public:bool isScramble(string s1, string s2) {if(m.count(s1) && m[s1].count(s2))return m[s1][s2];if(s1 == s2) return m[s1][s2]=true;for(int len = 1; len < s1.size(); ++len){string s1a = s1.substr(0,len), s1b = s1.substr(len);string s2a = s2.substr(0,len), s2b = s2.substr(len);string s2a_ = s2.substr(0,s2.size()-len), s2b_ = s2.substr(s2.size()-len);if(isScramble(s1a, s2a) && isScramble(s1b, s2b))return m[s1][s2] = true;if(isScramble(s1a, s2b_) && isScramble(s1b, s2a_))return m[s1][s2] = true;}return m[s1][s2] = false;}
};

192 ms 25.8 MB C++

2.2 动态规划

参考大力王的题解

  • dp[len][i][j] 表示 长度为 len, s1开始位置为 i,s2 开始位置为 j,是否可以互相表示
class Solution {    //DP
public:bool isScramble(string s1, string s2) {int n = s1.size();vector<vector<vector<bool>>> dp(n+1, vector<vector<bool>>(n, vector<bool>(n, false)));// dp[len][i][j] 表示 长度为 len  s1开始位置为i, s2 开始位置为 j,是否可以互相表示for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){dp[1][i][j] = (s1[i] == s2[j]);}}for(int len = 2; len <= n; ++len){for(int i = 0; i+len-1 < n; i++){for(int j = 0; j+len-1 < n; j++){for(int k = 1; k < len; ++k){if(dp[k][i][j] && dp[len-k][i+k][j+k]){dp[len][i][j] = true;break;}if(dp[k][i][j+len-k] && dp[len-k][i+k][j]){dp[len][i][j] = true;break;}}}}}return dp[n][0][0];}
};

56 ms 10.2 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题总结:一个 list 使用 for 遍历,边循环边删除的问题

一、需求&#xff1a; 对一个 list 数据类型写一个循环删除的程序 二、问题 来&#xff0c;我们来看看代码跟效果&#xff1a; # 初始化一个 list 列表&#xff0c;为了下边的方便比较&#xff0c;我就使用跟 list 索引来做 list 的元素 datas [0,1,2,3,4]# 打印元素组&am…

cpu使用率_漫话性能:CPU使用率

序言CPU 使用率是最直观和最常用的系统性能指标&#xff0c;更是我们在排查性能问题时&#xff0c;通常会关注的第一个指标。节拍率为了维护 CPU 时间&#xff0c;Linux 通过事先定义的节拍率&#xff08;内核中表示为 HZ&#xff09;&#xff0c;触发时间中断&#xff0c;并使…

谁动了我的产品

2014年3月中旬离开了自己奋斗三年的公司&#xff0c;这是一家海关政府公司&#xff0c;三年里无论是做项目需求分析、项目开发、项目测试、项目上线实施、项目上线跟踪、收集反馈、做项目版本修改&#xff0c;我和我的团队都在一个有非常明确目标、有非常明确思路的过程中&…

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非负整数的数据流输入 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;…&#xff0c;将到目前为止看到的数字总结为不相交的区间列表。 例如&#xff0c;假设数据流中的整数为 1&#xff0c;3&#xff0c;7&#xff0c;2&…

windows键按了没反应_windows快捷键使用 - 小怜

1、总的参考图&#xff1a;2、ctrl的组合使用&#xff1a;1与shift键结合&#xff1a;2 ctrl shift del # 快速清除浏览器缓存记录3 ctrl shift N # 浏览器当中&#xff0c;快速打开无痕新窗口。chrome内核的应该都可以&#xff0c;chrome和新…

Python倒计时自动发微信(电脑版微信)

一、前言&#xff1a; Python倒计时自动发微信&#xff08;电脑版微信登录状态&#xff09; 二、主要思路及步骤&#xff1a; 1、先启动微信 2、定位到搜索框 3、搜索微信 4、进入聊天窗口 5、粘贴文本内容 6、发送 7、关闭微信窗口 三、代码&#xff1a; import …

win10主题更换_还不升级? win10精简版不到10G,运行比win7还快,旧电脑的福音

即使现在win7系统已经停止了服务&#xff0c;但是还有许多人宁愿面对随时有可能出现问题的win7&#xff0c;还是不愿升级win10系统。至于原因&#xff0c;五花八门&#xff0c;比如win7兼容性和稳定性更好&#xff0c;比如win10经常更新&#xff0c;还有许多软件无法在win10环境…

LeetCode 1732. 找到最高海拔

文章目录1. 题目2. 解题1. 题目 有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。 自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff0…

小案例:利用python估算最外轮廓区域面积

一、需求&#xff1a; 给出一张图片&#xff0c;估算最外轮廓区域面积 二、步骤&#xff1a; 1、读取图片信息 2、利用open-cv&#xff0c;自适应分割图片 3、提取最外轮廓像素值 4、利用像素值标记轮廓 5、计算轮廓面积 三、代码&#xff1a; import cv2# 读取图片信息…

ApplicationContext容器的设计原理

1.在ApplicationContext容器中&#xff0c;我们以常用的FileSystemXmlApplicationContext的实现为例来说明ApplicationContext容器的设计原理。 2.在FileSystemXmlApplicationContext的设计中&#xff0c;我们看到ApplicationContext应用上下文的主要功能已经在FileSystemXmlAp…

使用c++查看linux服务器某个进程正在使用的内存_Linux 系统管理

1、进程管理介绍什么是进程程序是人使用计算机语言编写的&#xff0c;可以实现一定功能&#xff0c;并且可以执行的代码集合进程是正在执行当中的程序。程序在执行时&#xff0c;执行人的权限和属性、以及程序的代码都会被加载进内存&#xff0c;操作系统给这个进程分配一个 ID…

小案例:利用Python写个教师常用的点名软件

一、需求&#xff1a; 教师上课常用的点名软件 二、python库安装&#xff1a; openpyxl是Python中用于读写excel文件tkinter是Python中GUI编程非常好用的库&#xff0c;而且是标准库&#xff0c;不需要安装&#xff0c;导入即可使用random库是Python中用于实现随机功能的库&…

python contains类似函数_01--实际工作中,python基础理念和数据处理

1.工作中遇到的python坑1.1 合并文件问题&#xff1a;正常将文件依次读取并append时&#xff0c;莫名出现很多空行。解决&#xff1a;在append前删除空行&#xff1a;data_tmp 1.2 重复数据行问题&#xff1a; append多日文件时&#xff0c;由于人工误操作&#xff0c;容易存在…

小案例:利用Python实现图片上下、左右翻转

一、前言需求&#xff1a; 对图片进行操作&#xff0c;使图片上下、左右翻转 二、函数库&#xff1a; 使用Pillow模块提供的transpose()方法可以让图像翻转&#xff0c;上下翻转&#xff0c;或者左右翻转 三、操作说明&#xff1a; 原图如下&#xff1a; 图片上下翻转代码…

LeetCode 1736. 替换隐藏数字得到的最晚时间

文章目录1. 题目2. 解题1. 题目 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和…

【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径(四)...

目录&#xff1a; 【SSH进阶之路】Struts基本原理 实现简单登录&#xff08;二&#xff09; 【SSH进阶之路】一步步重构MVC实现Struts框架——从一个简单MVC开始&#xff08;三&#xff09; 【SSH进阶之路】一步步重构MVC实现Struts框架——封装业务逻辑和跳转路径&#xff08…

实用工具:推荐Pycharm常用的几款插件

相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的&#xff0c;今天来分享几个好用到爆的Pycharm插件&#xff0c;在安装上之后&#xff0c;你的编程效率、工作效率都能够得到极大地提升。 Pycharm插件安装教程 打开file---settings---plugins&#xff0c…

dataframe 添加一行_R语言Data Frame数据框常用操作

来源 | R友舍Data Frame一般被翻译为数据框&#xff0c;感觉就像是R中的表&#xff0c;由行和列组成&#xff0c;与Matrix不同的是&#xff0c;每个列可以是不同的数据类型&#xff0c;而Matrix是必须相同的。Data Frame每一列有列名&#xff0c;每一行也可以指定行名。如果不指…

LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)

文章目录1. 题目2. 解题1. 题目 给你两个字符串 a 和 b &#xff0c;二者均由小写字母组成。 一步操作中&#xff0c;你可以将 a 或 b 中的 任一字符 改变为 任一小写字母 。 操作的最终目标是满足下列三个条件 之一 &#xff1a; a 中的 每个字母 在字母表中 严格小于 b 中…

oracle对查询结果求和_oracle基础知识分享

原文链接&#xff1a;https://page.om.qq.com/page/OO2PXCD6VZ6CVqLqjpU6uShg0以下是本人整理的ORACLE学习的一些基本的语法知识&#xff0c;如有不对的地方&#xff0c;望大家批评指正&#xff0c;如有转载请注明出处&#xff1a;一、ORACLE完整性约束&#xff1a;1.NOT NULL …