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的子字符串进行预处理,然后从字典中取值组成答案。