2060. 同源字符串检测

2060. 同源字符串检测

原字符串由小写字母组成,可以按下述步骤编码:

任意将其 分割 为由若干 非空 子字符串组成的一个 序列 。
任意选择序列中的一些元素(也可能不选择),然后将这些元素替换为元素各自的长度(作为一个数字型的字符串)。
重新 顺次连接 序列,得到编码后的字符串。
例如,编码 “abcdefghijklmnop” 的一种方法可以描述为:

将原字符串分割得到一个序列:[“ab”, “cdefghijklmn”, “o”, “p”] 。
选出其中第二个和第三个元素并分别替换为它们自身的长度。序列变为 [“ab”, “12”, “1”, “p”] 。
重新顺次连接序列中的元素,得到编码后的字符串:“ab121p” 。
给你两个编码后的字符串 s1 和 s2 ,由小写英文字母和数字 1-9 组成。如果存在能够同时编码得到 s1 和 s2 原字符串,返回 true ;否则,返回 false。

注意:生成的测试用例满足 s1 和 s2 中连续数字数不超过 3 。

示例 1:输入:s1 = "internationalization", s2 = "i18n"
输出:true
解释:"internationalization" 可以作为原字符串
- "internationalization" -> 分割:      ["internationalization"]-> 不替换任何元素-> 连接:      "internationalization",得到 s1
- "internationalization"-> 分割:      ["i", "nternationalizatio", "n"]-> 替换:      ["i", "18",                 "n"]-> 连接:      "i18n",得到 s2
示例 2:输入:s1 = "l123e", s2 = "44"
输出:true
解释:"leetcode" 可以作为原字符串
- "leetcode" -> 分割:       ["l", "e", "et", "cod", "e"]-> 替换:       ["l", "1", "2",  "3",   "e"]-> 连接:       "l123e",得到 s1
- "leetcode" -> 分割:       ["leet", "code"]-> 替换:       ["4",    "4"]-> 连接:       "44",得到 s2
示例 3:输入:s1 = "a5b", s2 = "c5b"
输出:false
解释:不存在这样的原字符串
- 编码为 s1 的字符串必须以字母 'a' 开头
- 编码为 s2 的字符串必须以字母 'c' 开头
示例 4:输入:s1 = "112s", s2 = "g841"
输出:true
解释:"gaaaaaaaaaaaas" 可以作为原字符串
- "gaaaaaaaaaaaas"-> 分割:       ["g", "aaaaaaaaaaaa", "s"]-> 替换:       ["1", "12",           "s"]-> 连接:       "112s",得到 s1
- "gaaaaaaaaaaaas"-> 分割:       ["g", "aaaaaaaa", "aaaa", "s"]-> 替换:       ["g", "8",        "4",    "1"]-> 连接         "g841",得到 s2
示例 5:输入:s1 = "ab", s2 = "a2"
输出:false
解释:不存在这样的原字符串
- 编码为 s1 的字符串由两个字母组成
- 编码为 s2 的字符串由三个字母组成

提示:

  • 1 <= s1.length, s2.length <= 40
  • s1 和 s2 仅由数字 1-9 和小写英文字母组成
  • s1 和 s2 中连续数字数不超过 3

解题思路

使用深度优先搜索,加上记忆化搜索
每一次递归i, j, d,代表s1的前i个与s2的前j个字符进行匹配后,二者之间长度的差值为d

  • d>0,说明之前匹配的情况是s2的长度是大于s1的,所以s1要使用字母或者展开数字来填充差距
  • d<0,说明之前匹配的情况是s1的长度是大于s2的,所以s2要使用字母或者展开数字来填充差距
  • d==0,说明s1和s2的前面那部分是没有差值的
    每次递归根据i,j,d的值分类讨论
  1. 当i == n1 && j == n2 && d == 0,递归的边界,s1和s2完成匹配了
  2. 当d == 0 && i < n1 && j < n2 && s1[i] == s2[j] ,说明当前两个字符串的当前位置都是同样的字母或者数字,并且之前的匹配没有出现差值。
  3. d > 0 && i < n1 && isalpha(s1[i])或者d < 0 && j < n2 && isalpha(s2[j]),说明s1和s2之前匹配的长度出现了差值,可以尝试用一个字母填补1个长度差值
  4. 如果d>0或者d<0,说明之前的匹配出现了长度差值,而当前字符又为数字,可以利用数字去填充之前的长度差值

代码

class Solution {
public:char dp[41][41][2005];int n1, n2;string s1, s2;bool possiblyEquals(string s1, string s2) {this->n1 = s1.size();this->n2 = s2.size();this->s2 = s2;this->s1 = s1;memset(dp, -1, sizeof(dp));return  dfs(0, 0, 0);}bool dfs(int i, int j, int d) {if (dp[i][j][d + 1000] != -1)return dp[i][j][d + 1000];char res = i == n1 && j == n2 && d == 0;if (!res) res |= (d == 0 && i < n1 && j < n2 && s1[i] == s2[j] && dfs(i + 1, j + 1, 0));if (!res) res |= (d > 0 && i < n1 && isalpha(s1[i]) && dfs(i + 1, j, d - 1));if (!res) res |= (d < 0 && j < n2 && isalpha(s2[j]) && dfs(i, j + 1, d + 1));if (!res){int sum=0;if (d>=0){for (int k = i; k < n1&&isdigit(s1[k]); ++k) {sum=sum*10+s1[k]-'0';res|=dfs(k+1,j,d-sum);}}sum=0;if(d<=0){for (int k = j; k < n2&isdigit(s2[k]); ++k) {sum=sum*10+s2[k]-'0';res|=dfs(i,k+1,d+sum);}}}return dp[i][j][d+1000]=res;}
};

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

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

相关文章

vue中的data用return返回

为什么在大型项目中data需要使用return返回数据呢&#xff1f;答&#xff1a;不使用return包裹的数据会在项目的全局可见&#xff0c;会造成变量污染&#xff1b;使用return包裹后数据中变量只在当前组件中生效&#xff0c;不会影响其他组件。 1、在简单的vue实例中看到的Vue实…

白裤子变粉裤子怎么办_使用裤子构建构建数据科学的monorepo

白裤子变粉裤子怎么办At HousingAnywhere, one of the first major obstacles we had to face when scaling the Data team was building a centralised repository that contains our ever-growing machine learning applications. Between these projects, many of them shar…

ubuntu+anaconda+tensorflow 及相关问题

配置tensorflow部分参考&#xff1a;https://blog.csdn.net/XUTIAN1129/article/details/78997633 装完anaconda, source ~/.bashrc后, 可以直接 pip install tensorflow-gpu , 珍爱生命&#xff0c;远离bazel。但想要c/c调用tf的时候远离不了&#xff0c;还是得bazel编译安装t…

2022. 将一维数组转变成二维数组

2022. 将一维数组转变成二维数组 给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n 。你需要使用 original 中 所有 元素创建一个 m 行 n 列的二维数组。 original 中下标从 0 到 n - 1 &#xff08;都 包含 &#xff09;的元素构成二维数组的第一行&#xf…

支持向量机SVM算法原理及应用(R)

支持向量机SVM算法原理及应用&#xff08;R&#xff09; 2016年08月17日 16:37:25 阅读数&#xff1a;22292更多 个人分类&#xff1a; 数据挖掘实战应用版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明来源。 https://blog.csdn.net/csqazwsxedc/article/detai…

mad离群值_全部关于离群值

mad离群值An outlier is a data point in a data set that is distant from all other observations. A data point that lies outside the overall distribution of the dataset. Or in a layman term, we can say, an outlier is something that behaves differently from th…

2057. 值相等的最小索引

2057. 值相等的最小索引 给你一个下标从 0 开始的整数数组 nums &#xff0c;返回 nums 中满足 i mod 10 nums[i] 的最小下标 i &#xff1b;如果不存在这样的下标&#xff0c;返回 -1 。 x mod y 表示 x 除以 y 的 余数 。 示例 1&#xff1a;输入&#xff1a;nums [0,1,2…

SpringBoot中各配置文件的优先级及加载顺序

我们在写程序的时候会碰到各种环境(开发、测试、生产)&#xff0c;因而&#xff0c;在我们切换环境的时候&#xff0c;我们需要手工切换配置文件的内容。这大大的加大了运维人员的负担&#xff0c;同时会带来一定的安全隐患。 为此&#xff0c;为了能更合理地重写各属性的值&am…

青年报告_了解青年的情绪

青年报告Youth-led media is any effort created, planned, implemented, and reflected upon by young people in the form of media, including websites, newspapers, television shows, and publications. Such platforms connect writers, artists, and photographers in …

post提交参数过多时,取消Tomcat对 post长度限制

1.Tomcat 默认的post参数的最大大小为2M&#xff0c; 当超过时将会出错&#xff0c;可以配置maxPostSize参数来改变大小。 从 apache-tomcat-7.0.63 开始&#xff0c;参数 maxPostSize 的含义就变了&#xff1a; 如果将值设置为 0&#xff0c;表示 POST 最大值为 0&#xff0c;…

2048. 下一个更大的数值平衡数

2048. 下一个更大的数值平衡数 如果整数 x 满足&#xff1a;对于每个数位 d &#xff0c;这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。 给你一个整数 n &#xff0c;请你返回 严格大于 n 的 最小数值平衡数 。 示例 1&#xff1a;输入&#xff1a;n …

bzoj1222: [HNOI2001]产品加工

一开始以为是费用流。。然后搞不出来&#xff0c;路牌是DP&#xff0c;想一想 f[i][j]表示加工到第i个产品&#xff0c;然后A用时j&#xff0c;B用时的最小值 那么f[i][j]max(f[i-1][j-a[i]],f[i-1][j]b[i],f[i-1][j-c[i]]c[i]) 滚掉一维美滋滋 #include<cstdio> #includ…

map(平均平均精度_客户的平均平均精度

map(平均平均精度Disclaimer: this was created for my clients because it’s rather challenging to explain such a complex metric in simple words, so don’t expect to see much of math or equations here. And remember that I try to keep it simple.免责声明 &#…

Sublime Text 2搭建Go开发环境,代码提示+补全+调试

本文在已安装Go环境的前提下继续。 1、安装Sublime Text 2 2、安装Package Control。 运行Sublime&#xff0c;按下 Ctrl&#xff08;在Tab键上边&#xff09;&#xff0c;然后输入以下内容&#xff1a; import urllib2,os,hashlib; h 7183a2d3e96f11eeadd761d777e62404 e330…

629. K个逆序对数组

629. K个逆序对数组 给出两个整数 n 和 k&#xff0c;找出所有包含从 1 到 n 的数字&#xff0c;且恰好拥有 k 个逆序对的不同的数组的个数。 逆序对的定义如下&#xff1a;对于数组的第i个和第 j个元素&#xff0c;如果满i < j且 a[i] > a[j]&#xff0c;则其为一个逆…

zookeeper、hbase常见命令

a) Zookeeper&#xff1a;帮助命令-help i. ls /查看zk下根节点目录 ii. create /zk_test my_data//在测试集群没有创建成功 iii. get /zk_test my_data//获取节点信息 iv. set / zk_test my_data//更改节点相关信息 v. delete /zk_test//删除节点信…

鲜活数据数据可视化指南_数据可视化实用指南

鲜活数据数据可视化指南Exploratory data analysis (EDA) is an essential part of the data science or the machine learning pipeline. In order to create a robust and valuable product using the data, you need to explore the data, understand the relations among v…

2049. 统计最高分的节点数目

2049. 统计最高分的节点数目 给你一棵根节点为 0 的 二叉树 &#xff0c;它总共有 n 个节点&#xff0c;节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树&#xff0c;其中 parents[i] 是节点 i 的父节点。由于节点 0 是根&#xff0c;所以 p…

Linux lsof命令详解

lsof&#xff08;List Open Files&#xff09; 用于查看你进程开打的文件&#xff0c;打开文件的进程&#xff0c;进程打开的端口(TCP、UDP)&#xff0c;找回/恢复删除的文件。是十分方便的系统监视工具&#xff0c;因为lsof命令需要访问核心内存和各种文件&#xff0c;所以需要…

史密斯卧推:杠铃史密斯下斜卧推、上斜机卧推、平板卧推动作图解

史密斯卧推&#xff1a;杠铃史密斯下斜卧推、上斜机卧推、平板卧推动作图解 史密斯卧推&#xff08;smith press&#xff09;是固定器械上完成的卧推&#xff0c;对于初级健身者来说&#xff0c;自由卧推&#xff08;哑铃卧推、杠铃卧推&#xff09;还不能很好地把握平衡性&…