2825. 循环增长使字符串子序列等于另一个字符串

本文介绍了解决LeetCode问题2825的方法,使用双指针策略检查字符串str1中是否存在一个子序列,使得通过循环增长的方式可以等于字符串str2。通过辅助函数判断字符匹配,实现时间复杂度O(len1+len2)和空间复杂度O(1)的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Every day a Leetcode

题目来源:2825. 循环增长使字符串子序列等于另一个字符串

解法1:双指针

设置两个指针 i 和 j,分别指向字符串 str1 和 str2 的第一个字符。

双指针遍历 str1[i] 和 str2[j],如果 str1[i] 可以匹配 str2[j],那么 i 和 j 都加一,否则只有 i 加一。

匹配的含义是 str1[i] 等于 str2[j],或者 str1[i] 循环递增的下一个字符等于 str2[j]。

如果 j 等于 str2 的长度,则返回 true,否则返回 false。

代码:

/*
 * @lc app=leetcode.cn id=2825 lang=cpp
 *
 * [2825] 循环增长使字符串子序列等于另一个字符串
 */

// @lc code=start
class Solution
{
public:
    bool canMakeSubsequence(string str1, string str2)
    {
        // 特判
        if (str1.length() < str2.length())
            return false;
        if (str1 == str2)
            return true;

        int len1 = str1.length(), len2 = str2.length();
        int i = 0, j = 0;
        for (int i = 0; i < len1; i++)
        {
            if (match(str1[i], str2[j]))
                j++;
            if (j == len2)
                return true;
        }
        return false;
    }
    // 辅函数 - 判断字符 c1 和 c2 是否匹配
    bool match(char c1, char c2)
    {
        if (c1 == c2)
            return true;
        c1 = c1 == 'z' ? 'a' : char(c1 + 1);
        return c1 == c2;
        // return (c2 - c1 + 26) % 26 <= 1;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(len1 + len2,其中 len1 是字符串 str1 的长度,len2 是字符串 str2 的长度。

空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值