解题思路
这是一个子序列判断问题。需要判断字符串t是否是字符串s的子序列。子序列不要求连续,只需要保持相对顺序。
关键点:
- 理解子序列的定义
- 使用双指针遍历两个字符串
- 注意边界条件处理
算法步骤:
- 使用两个指针分别指向 和
- 遍历 中的每个字符,在 中寻找匹配
- 如果能匹配完所有 中的字符,则 是 的子序列
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool isSubsequence(string s, string t) {
int sLen = s.length();
int tLen = t.length();
int sIndex = 0;
// 遍历t中的每个字符
for (int tIndex = 0; tIndex < tLen; tIndex++) {
// 在s中寻找当前字符
while (sIndex < sLen && s[sIndex] != t[tIndex]) {
sIndex++;
}
// 如果s已经遍历完但t还没匹配完,返回false
if (sIndex >= sLen) {
return false;
}
sIndex++;
}
return true;
}
};
int main() {
string s, t;
getline(cin, s);
getline(cin, t);
Solution solution;
cout << (solution.isSubsequence(s, t) ? "Yes" : "No") << endl;
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public boolean isSubsequence(String s, String t) {
int sLen = s.length();
int tLen = t.length();
int sIndex = 0;
// 遍历t中的每个字符
for (int tIndex = 0; tIndex < tLen; tIndex++) {
// 在s中寻找当前字符
while (sIndex < sLen && s.charAt(sIndex) != t.charAt(tIndex)) {
sIndex++;
}
// 如果s已经遍历完但t还没匹配完,返回false
if (sIndex >= sLen) {
return false;
}
sIndex++;
}
return true;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String t = sc.nextLine();
Solution solution = new Solution();
System.out.println(solution.isSubsequence(s, t) ? "Yes" : "No");
sc.close();
}
}
class Solution:
def is_subsequence(self, s: str, t: str) -> bool:
s_len = len(s)
t_len = len(t)
s_index = 0
# 遍历t中的每个字符
for t_index in range(t_len):
# 在s中寻找当前字符
while s_index < s_len and s[s_index] != t[t_index]:
s_index += 1
# 如果s已经遍历完但t还没匹配完,返回False
if s_index >= s_len:
return False
s_index += 1
return True
# 读取输入
s = input().strip()
t = input().strip()
solution = Solution()
print("Yes" if solution.is_subsequence(s, t) else "No")
算法及复杂度
- 算法:双指针遍历
- 时间复杂度:,其中 是字符串 的长度
- 空间复杂度:,只需要常数额外空间