LeetCode 392. 判断子序列

题目链接:

力扣https://leetcode-cn.com/problems/is-subsequence/

【方法一】双指针,定义指针i,j分别指向s和t的开头,如果当前字符相同,就把i和j都向后移动,不然只移动j,看最后i能否移动到s的末尾即可。

class Solution {
    public boolean isSubsequence(String s, String t) {
        
        // 双指针
        int m = s.length(), n = t.length();
        int i = 0, j = 0;
        while(i < m && j < n){
            if(s.charAt(i) == t.charAt(j)) i++;
            j++;
        }
        return i == m;
    }
}

【方法二】为了解决大字符串的匹配问题,我们需要先对长的字符串做一个预处理,用一个(n+1)*26的dp数组记录当前这个字符下一个‘a'-’z'出现的位置,判断的时候只要去找下一个字符就行了。具体方法是,先初始化dp数组,把最后都设置为n,然后i从n-1开始遍历,把i位置中t出现的字符设置为i,其他字符设置为dp数组中i+1处该字符的值即可。

例如:

字符串t:ahbgdc

a h b g d c
a 0 6 6 6 6 6 6
b 2 2 2 6 6 6 6
c 5 5 5 5 5 5 6
d 4 4 4 4 4 6 6
e 6 6 6 6 6 6 6
f 6 6 6 6 6 6 6
g 3 3 3 3 6 6 6
h 1 1 6 6 6 6 6
class Solution {
    public boolean isSubsequence(String s, String t) {
        int m = s.length(), n = t.length();
        int i, j;
        int[][] dp = new int[n + 1][26];
        for(i = 0; i < 26; i++){
            dp[n][i] = n;
        }
        for(i = n - 1; i >= 0; i--){
            for(j = 0; j < 26; j++){
                if(t.charAt(i) == (char)(j + 'a'))
                    dp[i][j] = i;
                else
                    dp[i][j] = dp[i + 1][j];
            }
        }
        j = 0;
        for(i = 0; i < m; i++){
            if(dp[j][s.charAt(i) - 'a'] != n) j = dp[j][s.charAt(i) - 'a'] + 1;
            else break;
        }
        return i == m;
    }
}

你可能感兴趣的:(LeetCode,leetcode,双指针,动态规划)