首页 > 其他分享 >leedcode-判断子序列

leedcode-判断子序列

时间:2024-04-18 16:25:16浏览次数:25  
标签:index 判断 字符 leedcode li 索引 序列 mydict ptr

自己写的,有点麻烦

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 第一步先验证s是t的无序子序列
        # 使用字典记录t中每个字符的出现次数
        mydict = dict()
        for i in t:
            if not mydict.get(i):
                mydict[i] = 1
            else:
                mydict[i] += 1

        # 遍历s中的字符,检查其在t中是否出现过且次数充足
        for j in s:
            if not mydict.get(j) or mydict.get(j) == 0:
                return False
            else:
                mydict[j] -= 1
        
        # 下面验证子序列是有序的
        index_li = list()  # 存储s中字符在t中出现的索引位置
        t_li = list(t)  # 将字符串t转换为列表,方便操作
        for k in s:
            if k not in t_li:
                return False
            else:
                index_li.append(t_li.index(k))  # 记录字符在t中的索引位置
                # 将该字符在t中的索引位置及之前的字符替换为相应数量的星号
                t_li[0:t_li.index(k) + 1] = "*" * (t_li.index(k) + 1)
        
        # 验证索引位置是否递增,即s是否为有序子序列
        m = 0
        while m <= len(index_li) - 2:
            if index_li[m] < index_li[m + 1]:
                m += 1
            else:
                return False
        return True

改进了一点 省去了最后判断index_li是否递增的步骤:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 第一步先验证s是t的无序子序列
        mydict = dict()  # 创建一个字典,用于记录t中每个字符的出现次数
        for i in t:
            if not mydict.get(i):
                mydict[i] = 1
            else:
                mydict[i] += 1

        # 遍历s中的字符,检查其在t中是否出现过且次数充足
        for j in s:
            if not mydict.get(j) or mydict.get(j) == 0:
                return False
            else:
                mydict[j] -= 1
        
        # 下面验证子序列是有序的
        index_li = list()  # 存储s中字符在t中出现的索引位置
        t_li = list(t)  # 将字符串t转换为列表,方便操作

        last_index = -1  # 记录上一个字符在t中的索引位置,初始为-1
        for k in s:
            if k not in t_li:
                return False
            else:
                cur_index = t_li.index(k)  # 获取当前字符在t中的索引位置
                t_li[0:cur_index + 1] = "*" * (cur_index + 1)  # 将该字符在t中的索引位置及之前的字符替换为相应数量的星号
                
                # 检查当前字符的索引位置是否大于上一个字符的索引位置
                # 如果不是,则s不是t的有序子序列,返回False
                if cur_index > last_index:
                    last_index = cur_index
                else:
                    return False
        return True

 gpt优化过的,双指针法:

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        # 定义两个指针,分别指向s和t的开头
        s_ptr, t_ptr = 0, 0

        # 遍历t字符串,同时检查s中的字符是否在t中存在
        while t_ptr < len(t) and s_ptr < len(s):
            # 如果s的字符在t中出现,则移动s的指针
            if s[s_ptr] == t[t_ptr]:
                s_ptr += 1
            t_ptr += 1
        
        # 如果s的指针移动到了末尾,则说明s是t的子序列
        return s_ptr == len(s)

 

标签:index,判断,字符,leedcode,li,索引,序列,mydict,ptr
From: https://www.cnblogs.com/yyyjw/p/18143727

相关文章

  • json反序列化 JsonConvert.DeserializeObject 报错 One or more errors occurred. (U
    接口返回的字符串肉眼看起来正常,也是标准json,反序列化时候报错,字符串添加了UTF8-BOM头(windows记事本默认编码),可以通过以下代码移除标头//模拟json字符串对象varjsonStr="{}";byte[]buffer=Encoding.UTF8.GetBytes(jsonStr);varsResult=Encoding.UTF8.GetString......
  • C#判断窗体是否被遮挡 - 开源研究系列文章
    https://www.cnblogs.com/lzhdim/p/18122548  上次发布了托盘窗体的显示与隐藏的博文:,但是在测试窗体最大化的时候发现窗体没有隐藏,调试了下知道是窗体是否被遮挡这个函数的判断有问题。于是就研究了该代码,然后联系了该操作类的作者,也是博客园的园友,然后在他的帮助下将操作类进......
  • 记录一次CTF解题PHP反序列
    攻防世界的一个php反序列化题unserialize3PHP反序列化序列化通俗来讲就是将对象转化为可以传输的字符串,反序列化就是把那串可以传输的字符串再变回对象。<?phpclasschybate{var$test='123456';}$cless1=newchybate;//序列化$cless1_ser=serialize($cle......
  • 马拉车Mananer(求最长回文子序列)
    直接上板子直接输出最长回文子序列的长度#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);usingnamespacestd;chars[32000005],st[32000005];intp[32000005];intchange(){intlen=strlen(st);......
  • drf序列化用APIView写编写5个接口并校验数据
    步骤:写一个类,继承Serialier在类中写字段,字段就是要序列化的字段在视图函数中,序列化类,实例化得到对象,传入该传的参数调用序列化类对象的serializer.data方法完成序列化【一】写序列化类serializer.pyfromrest_frameworkimportserializersfromrest_framework.e......
  • shell脚本中的运算符和条件判断
    shell脚本中的运算符和条件判断:一、算术运算符在Shell脚本中,你可以使用各种运算符来执行数学运算、比较和逻辑操作。计算方式:$[]$(())例:a=$[(9+5)90]打印输出结果==>echo$a二、条件判断判断方式:test$a=90[$a=90]注意事项:判断处理中间空格隔开数字......
  • 29天【代码随想录算法训练营34期】第七章 回溯算法part05 (491.递增子序列 * 46.全排
    491.递增子序列如果在最前面加一个uset=set(),这个就是给这一层一个usedset,很好用,不错classSolution:deffindSubsequences(self,nums:List[int])->List[List[int]]:result=[]self.backtracking(nums,[],result,0)returnresult......
  • Prufer序列
    Prufer序列通常在图的计数问题中比较常用。Prufer序列的构造方法:(图片源自oiwiki)具体操作步骤:先找到叶子结点中编号最小的节点,然后删除。在Prufer序列中的元素就是每次删除的节点的父节点。由于最后操作必然会剩下两个节点,两个节点都是叶子结点,于是操作完毕,最终构造出的Prufer序......
  • 928. 尽量减少恶意软件的传播 II【并查集加暴力删边判断】
    题意不是很清晰:1.比如对于graph=[[1,1,0],[1,1,1],[0,1,1]],initial=[0,1]来说,可以发现结点的链接情况是0-1-2,感染源结点是0和1,若是按之前题目的要求,移除0和1都不会减少最终感染个数,但是应该返回结点0,因为其index小。但是应用此题的条件,就一定要返回结点1,因为移除结点1之......
  • 一种融合指代消解序列标注方法在中文人名识别上的应用(上)
    技术领域自然语言处理领域。应用场景:适用于自然语言处理领域,通过命名实体识别(NamedEntityRecognition,NER),准确识别实体。依托自然语言处理领域,基于人民日报数据及构造的舆情公告数据,提出一种融合指代消解的序列标注方法来改进人名识别。解决的问题:实体包括人名、地......