LeetCode 392 判断子序列

LeetCode 392 判断子序列

问题描述:
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

动态规划

  1. 对字符串s的每个位置i,考虑substr[0,i]已经包含了s中的前m个字符
  2. dp[i]表示s.substr(0,i+1)包含了s中的前dp[i]个字符
  3. dp[i+1] = s.charAt(i+1)==t.charAt(dp[i])? dp[i]+1: dp[i]
  4. dp[0] = s.charAt(0)==t.charAt(0)? 0: 1

执行用时:2 ms, 在所有 Java 提交中击败了40.31%的用户
内存消耗:37.9 MB, 在所有 Java 提交中击败了10.58%的用户

class Solution {
    //找连续的子序列可以使用双指针/滑动窗口
    public boolean isSubsequence(String s, String t) {
        if(s==null || s.length()==0) {
            return true;
        }else if(t==null || t.length()==0) {
            return false;
        }else if(s.length() > t.length()) {
            return false;
        }

        int[] dp = new int[t.length()];
        dp[0] = t.charAt(0)==s.charAt(0)? 1:0;
        for(int i=1; i<t.length(); i++) {
            dp[i] = (t.charAt(i)==s.charAt(dp[i-1]))? dp[i-1]+1: dp[i-1];
            if(dp[i]==s.length()) {
                return true;
            }
        }
        
        return false;
    }
}
原文地址:https://www.cnblogs.com/CodeSPA/p/13577534.html