• LeetCode 392. Is Subsequence 详解


    题目详情

    给定字符串 st ,判断 s 是否为 t 的子序列。

    你可以认为 st 中仅包含英文小写字母。字符串 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. 解法1

    首先这个题可以很容易的想出一个解法, 遍历s 然后遍历t 对t的每一个元素, 看是否等于s的一个元素, 同时维护一个变量保存上一次t和s相等的位置, 作为下一次遍历t的起点, 这样当遍历完整个t 如果s的字符有一个还没匹配就是false, 如果成功匹配就 true

    class Solution {
    public:
        bool isSubsequence(string s, string t) {
            //first 表示最近匹配成功的t的位置的下一个位置
            //conformSize表示S已匹配的字符
            int first = 0, conformSize = 0;
            
            for(int i = 0; i < s.size(); i++) {
                for (int j = first; j < t.size(); j++) {
                    if (s[i] == t[j]){
                        first = j + 1;
                        conformSize++;
                        break;
                    }
                }
            }
            //判断s是否完全匹配
           if (conformSize == s.size()) {
               return true;
            } else {
               return false;
            }
            
        }
    };
    

    这个解法速度很慢。

    当然代码可以简化, 用一个变量维护当前匹配到s的位置就不用循环s了

    bool isSubsequence(string s, string t) {
        int sLen = s.length(), sIdx = 0, tLen = t.length();
        for (int i=0; i<tLen && sIdx<sLen; i++) 
            if (t[i]==s[sIdx]) sIdx++;
        return sIdx==sLen;
    }
    

    速度变快了很多。

  • 相关阅读:
    Linux任务前后台的切换
    如何给html元素的onclick事件传递参数即如何获取html标签的data
    关键词多空格处理
    tp3常量
    php 正则判断是否是手机号码
    thinkphp 初始化
    删除图标
    time() 在thinkphp 3.2.3 模板格式化输出
    iOS工程如何支持64-bit
    调试instruments
  • 原文地址:https://www.cnblogs.com/qq874455953/p/10264440.html
Copyright © 2020-2023  润新知