class Solution {
public:
bool canMakeSubsequence(string str1, string str2) {
}
};
8014. 循环增长使字符串子序列等于另一个字符串
给你一个下标从 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 <= 105
1 <= str2.length <= 105
str1
和 str2
只包含小写英文字母。原站题解
php 解法, 执行用时: 56 ms, 内存消耗: 19.4 MB, 提交时间: 2023-08-21 09:55:34
class Solution { /** * @param String $str1 * @param String $str2 * @return Boolean */ function canMakeSubsequence($s, $t) { if ( strlen($s) < strlen($t) ) return false; $j = 0; for ( $i = 0; $i < strlen($s); $i++ ) { $c = $s[$i] != 'z' ? chr(ord($s[$i]) + 1) : 'a'; if ( $s[$i] == $t[$j] or $c == $t[$j] ) { $j++; if ( $j == strlen($t) ) return true; } } return false; } }
golang 解法, 执行用时: 8 ms, 内存消耗: 6.2 MB, 提交时间: 2023-08-21 09:48:57
func canMakeSubsequence(s, t string) bool { if len(s) < len(t) { return false } j := 0 for _, b := range s { c := byte(b) + 1 if b == 'z' { c = 'a' } if byte(b) == t[j] || c == t[j] { j++ if j == len(t) { return true } } } return false }
python3 解法, 执行用时: 132 ms, 内存消耗: 16.4 MB, 提交时间: 2023-08-21 09:48:41
''' 下文将 str1 简记为 s,将 str2 简记为 t。 想一想,如果 s[0] 可以匹配 t[0],那么此时一定要匹配,不然后面可能没有机会匹配 t[0]。 因此,双指针遍历 s[i] 和 t[j],如果 s[i] 可以匹配 t[j],那么 i 和 j 都加一,否则只有 i 加一。 如果 j 等于 t 的长度,则返回 true,否则返回 false。 ''' class Solution: def canMakeSubsequence(self, s: str, t: str) -> bool: if len(s) < len(t): return False j = 0 for b in s: c = chr(ord(b) + 1) if b != 'z' else 'a' if b == t[j] or c == t[j]: j += 1 if j == len(t): return True return False