• 关于子序列匹配的算法题经验总结


    前情提要

    子序列匹配问题是我比较讨厌的题,Java虽然有很多字符串的方法来帮忙解决,但我经常记不住各个方法具体的参数跟作用只记得大概的用法,平时开发的时候会比较给力,在算法题碰见我是比较讨厌的,当然主要还是怪我自己懒,不去记忆。

    这个类型是很多公司都喜欢的题,做过几家笔试发现基本上都有这些类型的题,可能是因为太经典了吧

    我们在学习数据结构学习算法的时候,有一个算法叫KMP算法,是典中典,我现在也记不清,但是我只知道它内容贼多,不想写,所以本篇就专门收录各种子序列匹配的相关算法题的各种解法来记忆,写起来简单,不难记是性价比最高的了,不追求100%ac,能过就行,这就是我等弱鸡的追求目标了。

    Here We Go ~

    【一天一题—Day77】392. 判断子序列

    一、前景提要

    简单题学个基础写法

    二、题目

    392. 判断子序列

    难度:简单

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
    
    字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
    
    进阶:
    
    如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    示例 1:

    输入:s = "abc", t = "ahbgdc"
    输出:true
    
    • 1
    • 2

    示例 2:

    输入:s = "axc", t = "ahbgdc"
    输出:false
    
    • 1
    • 2

    提示:

    • 0 <= s.length <= 100
    • 0 <= t.length <= 10^4
    • 两个字符串都只由小写字符组成。

    三、解答

    1,非官方解法

    不看想不到系列,理解挺简单的,字符串拆成一个个字符,把每个字符从0开始往后查有没有存在字符,如果存在就替换index,下次直接从这个index开始往后查省得重新从头开始查。

    它这个子序列用不着得完全相邻

    class Solution {
        public boolean isSubsequence(String s, String t) {
            int index = -1;
            for (char c : s.toCharArray()){
                index = t.indexOf(c, index+1);
                if (index == -1) return false;
            }
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2,官方解法

    官方解法

    【一天一题—Day78】792. 匹配子序列的单词数

    一、前景提要

    进阶写法

    二、题目

    792. 匹配子序列的单词数

    难度:中等

    给定字符串 s 和字符串数组 words, 返回  words[i] 中是s的子序列的单词个数 。
    
    字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。
    
    例如, “ace” 是 “abcde” 的子序列。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例 1:

    输入: s = "abcde", words = ["a","bb","acd","ace"]
    输出: 3
    解释: 有三个是 s 的子序列的单词: "a", "acd", "ace"。
    
    • 1
    • 2
    • 3

    示例 2:

    输入: s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
    输出: 2
    
    • 1
    • 2

    提示:

    • 1 <= s.length <= 5 * 104
    • 1 <= words.length <= 5000
    • 1 <= words[i].length <= 50
    • words[i]和 s 都只由小写字母组成。

    三、解答

    1,非官方解法

    多套一层数组的循环

    class Solution {
        public int numMatchingSubseq(String s, String[] words) {
            int count = 0;
            for(int i = 0; i < words.length; i++){
                int index = -1;
                for(char c : words[i].toCharArray()){
                    index = s.indexOf(c, index+1);
                    if(index == -1) break;
                }
                if(index != -1) count++;
            }
            return count;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    执行用时:1473 ms, 在所有 Java 提交中击败了5.15%的用户
    内存消耗:42.2 MB, 在所有 Java 提交中击败了93.66%的用户
    通过测试用例:53 / 53
    
    • 1
    • 2
    • 3

    虽然不是很高性能吧,但是能过

    2,官方解法

    官方解法

  • 相关阅读:
    647. 回文子串【双指针:两种对称情况-回文串】(字符串S中回文子串的个数)
    SLAM中旋转向量(旋转轴/旋转角)、旋转矩阵、四元数、李代数的相互转化(附C++ Eigen库代码实例)
    nginx配置
    机器学习中的 SVM(支持向量机)和随机森林及其优缺点
    visual studio code 创建 SSH 远程连接
    【软件工程导论】软件工程导论笔记
    15-55V输入自动升降压 光伏MPPT自动跟踪充电方案 大功率300瓦
    mysql事务
    12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917
    gdb and coredump分析
  • 原文地址:https://blog.csdn.net/qq_38677092/article/details/127905225