当前位置: 首页 > news >正文

算法设计与分析--动态规划(十)

Scramble String

更多技术博客 http://vilins.top/

题目

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

分析

法一:

从题目给出的定义来看,该过程是通过树来定义的,而树是通过递归进行定义的,那么我们可以大胆地猜测,这个过程可以通过递归的方式去解决。在完成验证之前,我们需要对一些简单的情况进行排除:

(isScramble(s1.substr(0, i), s2.substr(size - i, i))&&isScramble(s2.substr(0, size - i), s1.substr(i, size-i)))

另外一种情况是根节点下属的两个没有进行直接的交换,这时字符串的前半段是在前半段进行交换,后半段在后半段的范围内进行交换,情况如下:

isScramble(s1.substr(0, i), s2.substr(0, i))&&isScramble(s1.substr(i), s2.substr(i))

这两种情况有一种情况成立,我们就认为这个交换是合法的。

法二:

这里我们选择用动态规划思想去解决,定义dp[i][j][len]表示第一个字符串下标i开始,第二个字符串下标j开始的长度为len并且这个交换是合法的字串,那么最后结果的表示就是dp[0][0][size],那么我们求出其子问题即可,首先我们将两个字符串字符相等的对dp进行初始化,然后我们寻找状态转移方程,对应一个dp[i][j][len]是否合法,我们有一下三种情况:

dp[i][j][len] = (dp[i][j][k]&&dp[i+k][j+k][len-k])
dp[i][j][len] = (dp[i][j+len-k][k]&&dp[i+k][j][len-k])

综合起来,总的状态转移方程就是:

dp[i][j][len] = dp[i][j][len] || (dp[i][j][k]&&dp[i+k][j+k][len-k]) || (dp[i][j+len-k][k]&&dp[i+k][j][len-k]);

源码

递归实现
class Solution { public: bool isScramble(string s1, string s2) { if(s1 == s2) { return true; } //first base test if(s1.size() != s2.size()) { return false; } vector<int> count1(26, 0); vector<int> count2(26, 0); for(int i = 0; i < s1.size(); i++) { count1[s1[i] - 'a']++; count2[s2[i] - 'a']++; } for(int i = 0; i < 26; i++) { if(count1[i] != count2[i]) { return false; } } int size = s1.size(); for(int i = 1; i < s1.size(); i++) { if(isScramble(s1.substr(0, i), s2.substr(0, i))&&isScramble(s1.substr(i), s2.substr(i)) || (isScramble(s1.substr(0, i), s2.substr(size - i, i))&&isScramble(s2.substr(0, size - i), s1.substr(i, size-i)))) { return true; } } return false; } };
动态规划实现
class Solution { public: bool isScramble(string s1, string s2) { if(s1.size() == 0) { return true; } vector<vector<vector<bool>>> dp(s1.size(), vector<vector<bool>>(s2.size(), vector<bool>(s1.size()+1, false))); for(int i = 0; i < s1.size(); i++) { for(int j = 0; j < s2.size(); j++) { if(s1[i] == s2[j]) { dp[i][j][1] = true; } } } for(int len = 2; len <= s1.size(); len++) { for(int i = 0; i < s1.size() - len + 1; i++) { for(int j = 0; j < s2.size() - len + 1; j++) { for(int k = 1; k < len; k++) { dp[i][j][len] = dp[i][j][len] || (dp[i][j][k]&&dp[i+k][j+k][len-k]) || (dp[i][j+len-k][k]&&dp[i+k][j][len-k]); } } } } return dp[0][0][s1.size()]; } };

更多技术博客 http://vilins.top/

http://www.jsqmd.com/news/933275/

相关文章:

  • 别再乱用通配符了!SpringBoot3中PathPattern的匹配规则详解与性能测试
  • 实测对比:同步整流Buck芯片 vs 老古董LM2596,效率、发热和体积差了多少?
  • 2026年镍焊膏可靠性评测:黄铜焊膏/助焊膏/定制焊料/异形环/活性钎料/焊带/焊接加工/焊片/焊环/粘带焊料/选择指南 - 优质品牌商家
  • 2026年西门子S71200模块主流供应商排行盘点:光伏储能集成机柜/定制PLC控制柜/恒压供水控制柜/成套电气控制柜/选择指南 - 优质品牌商家
  • Sora 2水印不是“贴图”而是动态神经水印——2024年OpenAI最新专利解读及对抗性去除路径(附TensorRT加速部署)
  • 2026年边坡防护网厂家选型推荐 核心维度实测对比 - 优质品牌商家
  • Veo 2人物一致性失效的7个致命盲区:从ID Embedding断裂到姿态时序漂移的工业级修复手册
  • 从单机到多机:实战Loki+Promtail跨服务器日志收集,解决‘Data source connected, but no labels’和端口不通问题
  • 从Arduino到KSP实体控制台:硬件架构、通信协议与工程实践全解析
  • 2026年靠谱的温州地蹦床/户外蹦床/多人蹦床/温州弹跳蹦床公司选择指南 - 品牌宣传支持者
  • 告别WebUI!ComfyUI最新便携版Windows保姆级安装教程(含模型共享与汉化)
  • 从Oracle/Mysql迁移视角:在Linux上快速部署达梦DM8开发版做兼容性测试
  • 2026年西安老酒回收实体门店出价与服务排行盘点:西安老五粮液回收、西安老茅台回收、西安老西凤酒回收、西安茅台酒回收选择指南 - 优质品牌商家
  • 2026年第二季度PVC专用机定制厂家专业选择深度解析与推荐 - 2026年企业资讯
  • 别再只用欧氏距离了!用Python+NumPy手把手实现豪斯多夫距离,搞定图像匹配与异常检测
  • 2026年建筑工程主体结构检测机构第三方实测评测:广告牌性能检测、建筑工程主体结构检测、户外显示屏支架质量检测选择指南 - 优质品牌商家
  • 别再只玩Arduino了!用ESP8266-12F做个智能插座,从硬件选型到MQTT接入保姆级教程
  • 告别过曝和死黑!用Python+OpenCV玩转HDR多曝光融合,手机拍的照片也能救回来
  • 2026年钛合金切削液主流供应商排行及适配解析:铝合金切削液/铸铁切削液/镁合金切削液/防锈油/防锈蜡/陶瓷切削液/选择指南 - 优质品牌商家
  • Simulink里调用Adams整车模型:从机械导出到控制闭环的完整配置流程
  • MacBook Air电池更换全攻略:从诊断到安装的DIY实践
  • 告别依赖地狱:在Ubuntu 18.04上通过Snap或Flatpak无痛安装最新版VS Code
  • 厦门股权投资机构排行:厦门跨境电商财税、厦门代理记账、厦门哪家财务公司做跨境电商专业、厦门审计、厦门电商财税、厦门税收筹划选择指南 - 优质品牌商家
  • 2026年知名的大型蹦床/温州室内蹦床定制加工厂家推荐 - 行业平台推荐
  • 从零搭建高压H桥逆变器:自举驱动与修正正弦波输出实战
  • 2026年6月,衡水房屋设计市场如何选择?这五家信誉与实力兼备的公司值得深入了解 - 2026年企业资讯
  • 手把手教你用classification_report做多分类任务模型调优(附完整代码与可视化)
  • 基于NodeMCU与Blynk的智能花盆:物联网环境监测实践
  • EVE舰船配置终极指南:为什么你需要Python Fitting Assistant
  • Windows 11上OpenVINO 2023.2保姆级安装教程:从Python 3.8到Demo测试,一次搞定所有依赖