zoukankan      html  css  js  c++  java
  • 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;
    }
    

    速度变快了很多。

  • 相关阅读:
    actionbar
    记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新
    用c# 实现设计器 DesignSurface
    将C#程序嵌入资源中(C# 调用嵌入资源的EXE文件方法)
    【转】给自己的软件制作注册码
    免费的Web Service网址
    MS SQL 2005/8 无法远程连接的解决方案【留】
    IIS 部署 ASP.NET 的一个注意点
    成语验证
    C#利用msscript.ocx控件执行JS脚本
  • 原文地址:https://www.cnblogs.com/qq874455953/p/10264440.html
Copyright © 2011-2022 走看看