列表

详情


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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool canMakeSubsequence(string str1, string 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

上一题