基础算法(Leetcode)刻意练习第二十六天——贪心算法

引言

由 “LSGO软件技术团队” 组织的 “基础算法刻意练习” 采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。以下是我的每日打卡记录:


Task26.判断子序列

  • Leetcode第392题

  • 难度:简单

  • 题目概述:

      给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
      你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度
       ~= 500,000),而 s 是个短字符串(长度 <=100)。
      字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变
      剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序
      列,而"aec"不是)。
      
      示例 1:
      s = "abc", t = "ahbgdc"
      返回 true.
      
      示例 2:
      s = "axc", t = "ahbgdc"
      返回 false.
      
      后续挑战 :
      如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要
      依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
    

题解思路


  • 1.双指针

要比较两个字符串,则一个指针指向 s,一个指针指向 t,如果匹配,两指针向后移动;不匹配,则只移动 t 指针。直到一方遍历完成

时间复杂度:O(m+n)

class Solution {
    public boolean isSubsequence(String s, String t) {
        int ps=0; 
        int pt=0;
        while(ps<s.length() && pt<t.length())
            if(s.charAt(ps)==t.charAt(pt)){
                ps++;
                pt++;
            }
            else
                pt++;
        return ps==s.length();
    }
}

提交记录

基础算法(Leetcode)刻意练习第二十六天——贪心算法_第1张图片


  • 2.String类库方法:indexOf() (参考题解)

String 类中的 indexof(char c,int index) 方法能够从指定的索引 index 开始搜索,并返回指定字符第一次出现的索引,如果没找到返回 -1。利用这个方法,依次搜索字符串 s 中包含的字符,如果没找到则返回 false。

时间复杂度:O(n)

class Solution {
    public boolean isSubsequence(String s, String t) {
        char[] arr = s.toCharArray();
        int j = -1;
        for(int i = 0;i<arr.length;i++) {
            j = t.indexOf(arr[i],j+1);
            if(j==-1)
                return false;
        }
        return true;
    }
}

提交记录

基础算法(Leetcode)刻意练习第二十六天——贪心算法_第2张图片

你可能感兴趣的:(基础算法(Leetcode)刻意练习第二十六天——贪心算法)