2825. 循环增长使字符串子序列等于另一个字符串
来源第 111 场双周赛 Q2难度中等分数1414
题目描述
给你一个下标从 0 开始的字符串 str1 和 str2 。
一次操作中,你选择 str1 中的若干下标。对于选中的每一个下标 i ,你将 str1[i] 循环 递增,变成下一个字符。也就是说 'a' 变成 'b' ,'b' 变成 'c' ,以此类推,'z' 变成 'a' 。
如果执行以上操作 至多一次 ,可以让 str2 成为 str1 的子序列,请你返回 true ,否则返回 false 。
注意:一个字符串的子序列指的是从原字符串中删除一些(可以一个字符也不删)字符后,剩下字符按照原本先后顺序组成的新字符串。
示例 1:
输入:str1 = "abc", str2 = "ad" 输出:true 解释:选择 str1 中的下标 2 。 将 str1[2] 循环递增,得到 'd' 。 因此,str1 变成 "abd" 且 str2 现在是一个子序列。所以返回 true 。
示例 2:
输入:str1 = "zc", str2 = "ad" 输出:true 解释:选择 str1 中的下标 0 和 1 。 将 str1[0] 循环递增得到 'a' 。 将 str1[1] 循环递增得到 'd' 。 因此,str1 变成 "ad" 且 str2 现在是一个子序列。所以返回 true 。
示例 3:
输入:str1 = "ab", str2 = "d" 输出:false 解释:这个例子中,没法在执行一次操作的前提下,将 str2 变为 str1 的子序列。 所以返回 false 。
提示:
1 <= str1.length <= 1051 <= str2.length <= 105str1和str2只包含小写英文字母。
解法
方法一:双指针
思考
\(str2\) 须成为 \(str1\) 的子序列,且每位至多做一次循环加一。从左到右扫描 \(str1\),若当前字符或其后继等于 \(str2\) 的待匹配位则推进指针;指针走完即成功。
本题实际上需要我们判断一个字符串 \(s\) 是否为另一个字符串 \(t\) 的子序列,只不过字符之间可以不完全匹配,如果两个字符相同,或者一个字符是另一个字符的下一个字符,就可以匹配。
时间复杂度 \(O(m + n)\),其中 \(m\) 和 \(n\) 分别是字符串 \(str1\) 和 \(str2\) 的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 | |