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

交错字符串-二维dp

交错字符串

Solution

这题的状态定义比较巧妙,dp是一个bool类型的数组,dp(i,j)表示s1的前i个字符加上s2的前j个字符是否能够交错形成s3的前i+j个字符。

考虑dp(i,j),当前处于s3的第i+j-1个字符,这个字符有两种可能的来源,可能来自于s1的第i个字符,也可能来自于s2的第j个字符,如果这三个字符都相等,则在两种情况中取一种情况即可,也就是取或。

#include<iostream>
#include<vector>
using namespace std;//dp做法
bool f1(string s1, string s2, string s3) {int n1 = s1.length();int n2 = s2.length();//dp(i,j)表示s1的前i个字符与s2的前j个字符是否能组成s3的前i+j个字符vector<vector<bool>>dp(n1 + 1, vector<bool>(n2 + 1, false));if (n1 + n2 != s3.length()) return false;//base casedp[0][0] = true;for (int i = 1; i <= n1; ++i) {if (s1[i - 1] == s3[i - 1]) dp[i][0] = true;elsebreak;}for (int j = 1; j <= n2; ++j) {if (s2[j - 1] == s3[j - 1])dp[0][j] = true;else break;}for (int i = 1; i <= n1; ++i) {for (int j = 1; j <= n2; ++j) {if (s1[i - 1] == s3[i + j - 1] && s2[j - 1] == s3[i + j - 1])dp[i][j] = dp[i - 1][j] || dp[i][j - 1];else if (s1[i - 1] == s3[i + j - 1] && s2[j - 1] != s3[i + j - 1])dp[i][j] = dp[i - 1][j];else if (s1[i - 1] != s3[i + j - 1] && s2[j - 1] == s3[i + j - 1])dp[i][j] = dp[i][j - 1];}}return dp[n1][n2];
}//dp+空间压缩
bool f2(string s1, string s2, string s3) {int n1 = s1.length();int n2 = s2.length();int n3 = s3.length();if (n1 + n2 != n3) return false;vector<int>dp(n2 + 1, false);dp[0] = true;for (int i = 0; i <= n1; ++i) {for (int j = 0; j <= n2; ++j) {int p = i + j - 1;if (i > 0) {dp[j] &= (s1[i - 1] == s3[p]);}if (j > 0) {dp[j] |= (dp[j - 1] && s2[j - 1] == s3[p]);}}}return dp[n2];
}
bool isInterleave1(string s1, string s2, string s3) {return f1(s1, s2, s3);
}bool isInterleave(string s1, string s2, string s3) {return f2(s1, s2, s3);
}int main() {return 0;
}

http://www.dtcms.com/a/330341.html

相关文章:

  • 如何通过 Actor 网络压缩为概率分布实现
  • RK3568 Linux驱动学习——新字符设备驱动
  • 人工智能入门①:AI基础知识(上)
  • Vue3 vs Vue2:全面对比与面试宝典
  • 接口添加了 @Transactional 注解并开启事务,而其中一个小方法启动了新线程并手动提交数据,会有什么影响?
  • 红黑树的特性与实现
  • 打靶日常-文件上传
  • 【Python】新手入门:什么是python运算符?python运算符有哪些种类?运算符优先级是怎么样的?
  • Go语言函数详解:从基础到高阶的行为逻辑构建
  • C5.4:光电器件
  • RagFlow启动源码说明
  • Linux framebuffer 编程入门:直接操作显存画图
  • Flutter权限管理三步曲:检查、申请、处理全攻略
  • 【超算】算力的精度,数据中心的划分标准与行业现状(国家超级计算机,企业万卡GPU集群)
  • 深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
  • 关于linux软件编程4:目录IO和一些时间函数
  • PAT 1065 A+B and C (64bit)
  • 驱动开发系列62 - glBufferDataARB实现分析
  • Windows下cuda的安装和配置
  • BGP 笔记梳理
  • 110. 字符串接龙
  • 【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(6)——MCP Client(MCP客户端)
  • 最新Coze(扣子)智能体工作流:用Coze实现「图片生成-视频制作」全自动化,3分钟批量产出爆款内容
  • Docker网络命名空间隔离与VPS服务器环境的连通性测试方法解析
  • kali linux 2025.2配置局域网打印服务器惠普打印机HP1108p
  • MySQL查询表结构、表大小
  • 告别意外中断,iOS辅助工具按键精灵「异常停止重启脚本」功能介绍
  • <c1:C1DateTimePicker的日期时间控件,控制日期可以修改,时间不能修改,另外控制开始时间的最大值比结束时间小一天
  • git clone 支持在命令行临时设置proxy
  • 康托展开与逆康托展开