392. 判断子序列

标签: LeetCode392 判断子序列
10人阅读 评论(1) 收藏 举报
分类:

这里写图片描述


1、动归

首先想到的就是利用动归,先从简单的开始,利用一个二维辅助数组 dp[i][j],表示 s.sub(0,i) 是否为 t.sub(0,j)的子序列,其中有转换方程:

if (dp[i][j - 1]) dp[i][j] = true;
else dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i) == t.charAt(j));

即如果 s.sub(0,i)t.sub(0,j-1)的子序列,则肯定也是 t.sub(0,j)的子序列;否则,就需要看 s.sub(0,i-1) 是否为 t.sub(0,j-1)的子序列,如果是的话就只要比较 s(i)t(j)是否相等,相等则 s.sub(0,i)t.sub(0,j)的子序列。

public static boolean isSubsequence(String s, String t) {
    if (s == null || s.length() == 0) return true;
    //该判断需要放在上一判断的后面,不然就要额外判断 t.length()==0 且 s.length()==0 的情况,此时应该是返回 true 的
    if (t == null || t.length() == 0 || s.length() > t.length()) return false;
    int len1 = s.length(), len2 = t.length();
    boolean[][] dp = new boolean[len1][len2];
    dp[0][0] = s.charAt(0) == t.charAt(0);
    //第一排的需提前确定好,因为下面有涉及 dp[i-1]
    for (int j = 1; j < len2; j++) {
        //可能存在 s.chatAt(0) 与 t.chatAt(0) 不相等但是与 t.chatAt(j>0) 相等的情况
        dp[0][j] = dp[0][j - 1] || s.charAt(0) == t.charAt(j);//
    }
    for (int i = 1; i < len1; i++) {
        dp[i][i] = dp[i - 1][i - 1] && (s.charAt(i) == t.charAt(i));
    }
    for (int i = 1; i < len1; i++) {
        for (int j = i + 1; j < len2; j++) {
            if (dp[i][j - 1]) dp[i][j] = true;
            else dp[i][j] = dp[i - 1][j - 1] && (s.charAt(i) == t.charAt(j));
            //如果已经完整的判断了 s 字符串是 t 的子串,就没必要判断后面的了
            if (i == len1 - 1 && dp[i][j]) return true;
        }
    }
    return dp[len1 - 1][len2 - 1];
}

2、基于单次遍历

参考自 用时为 2 ms 的范例

该实现只需要 O(t.length())的时间复杂度,即只需要遍历 t.length() 的长度

public static boolean isSubsequence2(String s, String t) {
    if (s == null || s.length() == 0) return true;
    //该判断需要放在上一判断的后面,不然就要额外判断 t.length()==0s.length()==0 的情况,此时应该是返回 true 的
    if (t == null || t.length() == 0 || s.length() > t.length()) return false;

    // index 用于遍历 s 的每个字符,看每一个字符是否按相对位置存在于 t 中
    // 如果 s(i) 在 t(j) 的位置,则 s(i+1) 只需要从 t(j+1) 遍历比对
    for(int index = 0,pos = 0; index < s.length(); index++,pos++){
        pos = t.indexOf(s.charAt(index),pos);
        if(pos == -1){
            return false;
        }
    }
    return true;
}

for(int index = 0,pos = 0; index < s.length(); index++,pos++){
    pos = t.indexOf(s.charAt(index),pos);
    if(pos == -1){
        return false;
    }
}

扩展即为:

int tPos = 0;
for (int i = 0; i < s.length(); i++) {
    int j = tPos;
    tPos=-1;
    for (; j < t.length(); j++) {
        if (s.charAt(i) == t.charAt(j)) {
            tPos = j + 1;
            break;
        }
    }
    if (tPos == -1) return false;
}
查看评论

基于深度学习实现场景判断模型和算法优化

-
  • 1970年01月01日 08:00

392. Is Subsequence (子序列判断)

Given a string s and a string t, check if s is subsequence of t. You may assume that there is onl...
  • xiangwanpeng
  • xiangwanpeng
  • 2016-11-29 10:53:35
  • 683

Leetcode 392. Is Subsequence 判断子序列 解题报告

1 解题思想给定了S和T,让你判断S是否是T的子序列,其中T会非常大,S不大这道题做法很简单,两个指针就可以,无论如何指向T的每轮都要前进,而S的那个只有当当前指针下S和T一致的情况下才前进记得提前转...
  • MebiuW
  • MebiuW
  • 2016-09-05 22:38:43
  • 2587

[C++] LeetCode 392. 判断子序列

题目 给定字符串 s 和 t ,判断 s 是否为t的子序列。 你可以认为 s 和t中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 &amp;...
  • lv1224
  • lv1224
  • 2018-04-11 14:13:14
  • 5

[LeetCode] Is Subsequence 判断一个字符串是否为另一个的子序列

声明:原题目转载自LeetCode,解答部分为原创 Problem : Given a string s and a string t, check if s is subse...
  • xblog_
  • xblog_
  • 2017-05-21 11:10:41
  • 1235

网易内推笔试编程题-字符串子序列判断

题目描述: 牛牛拿到了一个藏宝图,顺着藏宝图的指示,牛牛发现了一个藏宝盒,藏宝盒上有一个机关,机关每次会显示两个字符串s和t,根据古老的传说,牛牛需要每次都回答t是否是s的子序列。注意,子序列不要求在...
  • SOLO_RAIN
  • SOLO_RAIN
  • 2016-08-03 10:07:36
  • 1200

判断一个序列是否是另外一个序列的子序列的算法

思路一: 从子序列中挨个找,找到一个之后,截取子序列和母序列之前的,然后继续递归自身 1.先分析下找不到的情况,如果母序列从头找到尾,也没有找到,则视为不是其子序列 2.继续分析找到的情况,...
  • perfectnihil
  • perfectnihil
  • 2017-07-31 13:10:31
  • 627

Lintcode392——打劫房屋

题目: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动...
  • westbrook1998
  • westbrook1998
  • 2018-02-19 19:21:14
  • 39

动态规划--子序列的个数

使用动态规划算法的一道题目,题目详情: 子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1...
  • xuzewei_2
  • xuzewei_2
  • 2013-09-23 10:05:59
  • 2145

第1章第2节练习题14 判断子序列

两个整数序列A=a1,a2,a3,...,amA=a_1, a_2, a_3, ... ,a_m和B=b1,b2,b3,...,bnB=b_1, b_2, b_3, ..., b_n已经存入两个单链表...
  • u013595419
  • u013595419
  • 2016-01-13 14:08:02
  • 1526
    个人资料
    持之以恒
    等级:
    访问量: 467
    积分: 221
    排名: 28万+
    文章存档