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

前情提要

子序列匹配问题是我比较讨厌的题,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:

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

示例 2:

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

提示:

  • 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;
    }
}

2,官方解法

官方解法

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

一、前景提要

进阶写法

二、题目

792. 匹配子序列的单词数

难度:中等

给定字符串 s 和字符串数组 words, 返回  words[i] 中是s的子序列的单词个数 。

字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。

例如, “ace” 是 “abcde” 的子序列。

示例 1:

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

示例 2:

输入: s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
输出: 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;
    }
}
执行用时:1473 ms, 在所有 Java 提交中击败了5.15%的用户
内存消耗:42.2 MB, 在所有 Java 提交中击败了93.66%的用户
通过测试用例:53 / 53

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

2,官方解法

官方解法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值