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)。