BM22 比较版本号、NC28 最小覆盖子串

5 篇文章 0 订阅
1 篇文章 0 订阅

1.题:牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等。现在给你2个版本号version1和version2,请你比较他们的大小。

#利用两个指针表示字符串的下标,分别遍历两个字符串。
#将点之间的部分转化为数字再比较
#截取点之前的数字字符组成数字,即在遇到一个点之前,直接取数字,加在前面数字乘10的后面。 


class Solution:
    def compare(self , version1: str, version2: str) -> int:
        i,j,=0,0
        while i<len(version1) or j<len(version2):#双指针 从左遍历到右
            n1,n2=0,0
            while i <len(version1) and version1[i]!=".":#取一个点到一个点之间的数
                n1=n1*10+int(version1[i])
                i+=1
            while j <len(version2) and version2[j]!=".":#取一个点到一个点之间的数
                n2=n2*10+int(version2[j])
                j+=1
            if n1>n2:#每取一次点到点的结果,比较一次,比较出来就返回
                return 1
            elif n2>n1:
                return -1
            i+=1
            j+=1
        return 0 #比较完都无法比较出大小关系

2.题:给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。

  •  #用指针p,q表示滑动窗口的左边界和右边界

        1.不断增加q使滑动窗口增大,直到窗口包含了T的所有元素
        2.增加p来求最小的字串:将不必要的元素排除在外,直到碰到一个必须包含的元素
        3.让p再增加一个位置,开始寻找下一个满足条件的滑动窗口

class Solution:
    def minWindow(self , s: str, T: str) -> str:
        dic,p,q,count={},0,0,0
        res=[0,float('inf')]#记录滑动窗口左右边界
        for i in T:
            dic[i]=dic.get(i,0)+1
            count+=1#记录字典中的目标数量
        while q<len(s):
            #1.不断增加q使滑动窗口增大,
            dic[s[q]]=dic.get(s[q],0)-1
            if dic[s[q]]>-1:#遇到了T中元素
                count-=1
            if count==0:#直到窗口包含了T的所有元素
                #2. 增加p,排除多余元素
                while p<q:
                    if dic[s[p]]==0:#碰到一个必须包含的元素
                        break
                    elif dic[s[p]]<0:#多余元素
                        dic[s[p]]+=1#更新dic
                        p+=1#滑动窗口往右缩小
                if q-p<res[1]-res[0]:#更新和记录索引p,q
                    res=[p,q]
            q+=1
        return '' if res[1]>len(s) else s[res[0]:res[1]+1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值