LeetCode第6356题-子字符串异或查询-python实现-图解思路与手撕代码

LeetCode第6356题-子字符串异或查询-python实现-图解思路与手撕代码


一、题目描述

在这里插入图片描述
在这里插入图片描述

二、解题思路与代码实现

1.解题思路

根据val ^ first = second可知val = first ^ second。

根据数据提示,first和second都小于10 ^ 9,而两个小于10 ^ 9数异或的结果不会大于2 ^ 30-1,所以只需要对长度小于30的子字符串进行处理。

首先将所有长度小于30的子字符串的数值大小和起止位置存入字典,然后不断根据first ^ second的值查找字典,组成答案即可。

2.代码实现

代码如下(示例):

class Solution:
    def substringXorQueries(self, s: str, queries: List[List[int]]) -> List[List[int]]:
        n=len(s)
        # 两个小于10^9数异或的结果不会大于2^30-1,所以对长度小于30的子字符串进行预处理
        m={}
        for l in range(n):
            x=0
            for r in range(l,min(l+30,n)):
                # 由于'0'和'1'的ASSIC值的最后一位分别是0和1,所以ord(s[r])-ord('0')==ord(s[r])&1
                # x=(x<<1) | (ord(s[r])-ord('0'))
                x=(x<<1) | (ord(s[r]) & 1)
                # 如果取到的值不在字典中,或者字典中的那个字符串长度小于当前值,就更新字典
                if x not in m or m[x][1]-m[x][0]>r-l:
                    m[x]=(l,r)
        NOT_FOUND=(-1,-1)
        return [m.get(x^y,NOT_FOUND) for (x,y) in queries]

总结

这道题的思路比较独特,只对长度小于30的子字符串进行预处理,然后从字典中取值组成答案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值