LeetCode392. 判断子序列

思路1:双指针。每次贪心的匹配,如果匹配成功则同时右移。

☆☆☆思路2:动态规划。

代码1:

class Solution {
    public boolean isSubsequence(String s, String t) {
        // 时间复杂度: O(n+m)  空间复杂度:O(1)
        int si = 0, ti = 0;
        while (si < s.length() && ti < t.length()) {
            if (s.charAt(si) == t.charAt(ti)) {
                si ++;
                ti ++;
            }else {
                ti ++;
            }
        }
        return si == s.length();
    }
}

代码2:

class Solution {
    public boolean isSubsequence(String s, String t) {
        int m = s.length(), n = t.length();
        if (m > n) return false;
        if (m == 0) return true;
        /**
         * 状态的定义1:dp[i][j]表示 s中以第i个字符结尾的字符串 是否是 t中以第j个字符结尾的字符串 的子序列
         */
        boolean[][] dp = new boolean[m][n];
        dp[0][0] = s.charAt(0) == t.charAt(0) ? true : false;
        for (int j = 1; j < n; j++) {
            dp[0][j] = s.charAt(0) == t.charAt(j) ? true : dp[0][j-1];
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (s.charAt(i) == t.charAt(j)) {
                    dp[i][j] = dp[i-1][j-1];
                }else {
                    dp[i][j] = dp[i][j-1];
                }
            }
        }
        return dp[m - 1][n - 1];
        /**
         * 状态定义2:dp[i][j]表示 s中前i个字符 是否是 t中前j个字符 的子序列
         */
        /*
        boolean[][] dp = new boolean[m + 1][n + 1];
        for (int j = 0; j <= n; j++) {
            dp[0][j] = true;
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s.charAt(i - 1) == t.charAt(j - 1)) {
                    dp[i][j] = dp[i-1][j-1];
                }else {
                    dp[i][j] = dp[i][j-1];
                }
            }
        }
        return dp[m][n];
        */
    }
}
原文地址:https://www.cnblogs.com/HuangYJ/p/14232868.html