力扣刷题Days5(js)

本文介绍了如何使用贪心算法解决判断字符串s是否为t的子序列问题,通过初始化指针并逐个字符匹配,当s的某个字符等于t的相应位置字符时,两者指针同时移动。作者分享了从实例抽象、代码优化到理解贪心策略的心得体会。
摘要由CSDN通过智能技术生成

题目

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

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。


1,代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isSubsequence = function(s, t) {
    let i=0,j=0;
    const n = s.length,m=t.length;
    while(i< n && j<m){
        if(s[i] === t[j]){
            i++;
           
        }
            j++;
    }
    return i === n
    
};

2,学习与总结

2.1 贪心算法

  • 每次贪心地匹配靠前的字符是最优决策

假定当前需要匹配字符 c,而字符 c在 t 中的位置 x1和 x2,出现(x1<x2),那么贪心取 x1是最优解,因为 x2后面能取到的字符,x1也都能取到,并且通过 x1与 x2 之间的可选字符,更有希望能匹配成功。

作者:力扣官方题解

2.2结合本题思考过程收获

  • 算法过程

初始化两个指针 i 和 j,分别指向 s 和 t 的初始位置。

贪心地匹配:

     匹配成功则 i和 j 同时右移,匹配 s 的下一个位置;

     匹配失败则 j 右移,i 不变,尝试用 t 的下一个字符匹配;

  • 思考过程简记

1,while的循环条件,经过实例 抽象化 准确实现;

2,判断是否匹配成功的关键在于 s是否匹配完;

3,我第一次可以实现代码逻辑,但是代码冗余较多;

4,贪心算法的第一次实践。一开始有被多个可以匹配的字母干扰到,原因在于没有很好理解贪心算法--贪心地匹配靠前的字符是最优决策;

2.3注意看 很精炼!

 while(i< n && j<m){
        if(s[i] === t[j]){
            i++;
           
        }
            j++;
    }
    return i === n

进阶下一阶段再练习。

告诫自己:贵在坚持!

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值