zoukankan      html  css  js  c++  java
  • 二分--判断子序列

    题目:https://leetcode-cn.com/problems/is-subsequence/

    给定字符串 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 class Solution {
     2 public:
     3     vector<int> memo[26];
     4     bool isSubsequence(string s, string t) {
     5         for(int i = 0;i < t.size();++i)
     6             memo[t[i] - 'a'].push_back(i);
     7         int u = -1;
     8         for(auto p : s){
     9             int l = 0, r = memo[p - 'a'].size() - 1;
    10             if(r < 0) return false;
    11             while(l < r){
    12                 int mid = (l + r) >> 1;
    13                 if(memo[p - 'a'][mid] > u) r = mid;
    14                 else l = mid + 1;
    15             }
    16             if(memo[p - 'a'][l] <= u) return false;
    17             u = memo[p - 'a'][l];
    18         }
    19         return true;
    20     }
    21 };
    View Code
  • 相关阅读:
    第一次作业
    C语言I博客作业02
    C语言|博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    JDK-14 & Eclipse & Hello World!
  • 原文地址:https://www.cnblogs.com/sxq-study/p/12355340.html
Copyright © 2011-2022 走看看