解题思路

这是一个子序列判断问题。需要判断字符串t是否是字符串s的子序列。子序列不要求连续,只需要保持相对顺序。

关键点:

  1. 理解子序列的定义
  2. 使用双指针遍历两个字符串
  3. 注意边界条件处理

算法步骤:

  1. 使用两个指针分别指向
  2. 遍历 中的每个字符,在 中寻找匹配
  3. 如果能匹配完所有 中的字符,则 的子序列

代码

#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")

算法及复杂度

  • 算法:双指针遍历
  • 时间复杂度:,其中 是字符串 的长度
  • 空间复杂度:,只需要常数额外空间