文章目录
- [5993. 将找到的值乘以 2](https://leetcode-cn.com/problems/keep-multiplying-found-values-by-two/)
- [5981. 分组得分最高的所有下标](https://leetcode-cn.com/problems/all-divisions-with-the-highest-score-of-a-binary-array/)
- [5994. 查找给定哈希值的子串](https://leetcode-cn.com/problems/find-substring-with-given-hash-value/)
- [5995. 字符串分组](https://leetcode-cn.com/problems/groups-of-strings/)
- 总结
5993. 将找到的值乘以 2
白给题,哈希三行
class Solution:
def findFinalValue(self, nums: List[int], original: int) -> int:
cnt=Counter(nums)
while cnt[original]:original*=2
return original
5981. 分组得分最高的所有下标
白给,但四行较难
class Solution:
def maxScoreIndices(self, nums: List[int]) -> List[int]:
pre=[0,*accumulate(nums,func=lambda x,y:x+(y==1))]
res=[[i,i-pre[i]+pre[-1]-pre[i]] for i in range(len(nums)+1)]
m=max(j for i,j in res)
return [i for i,j in res if j==m]
5994. 查找给定哈希值的子串
卡了快1小时。。。思路如下:
- 滑动窗口求子串
- 不考虑mod,hash值可以这样转移:
- h a s h 【 l e e 】 = v a l ( l ) ∗ p 0 + v a l ( e ) ∗ p 1 + v a l ( e ) ∗ p 2 hash【lee】= val(l) * p^0 + val(e) * p^1 + val(e) * p^2 hash【lee】=val(l)∗p0+val(e)∗p1+val(e)∗p2
- h a s h 【 e e t 】 = v a l ( e ) ∗ p 0 + v a l ( e ) ∗ p 1 + v a l ( t ) ∗ p 2 hash【eet】= val(e) * p^0 + val(e) * p^1 + val(t) * p^2 hash【eet】=val(e)∗p0+val(e)∗p1+val(t)∗p2
- h a s h 【 e e t 】 = ( h a s h 【 e e t 】 − v a l ( l ) ∗ p 0 ) / / p + v a l ( t ) ∗ p 2 hash【eet】= (hash【eet】- val(l) * p^0)//p + val(t) * p^2 hash【eet】=(hash【eet】−val(l)∗p0)//p+val(t)∗p2
- 考虑mod,除法不满足取余的恒等性,可以采取倒序(乘法满足取余恒等)
- 乘法: h a s h 【 l e e 】 = ( h a s h 【 e e t 】 − v a l ( t ) ∗ p 2 ) ∗ p + v a l ( l ) ∗ p 0 hash【lee】= (hash【eet】- val(t) * p^2)*p + val(l) * p^0 hash【lee】=(hash【eet】−val(t)∗p2)∗p+val(l)∗p0
考虑优化,思路如下:
- 不取子串(切片/substr之类的会产生一个新的 string,构造新 string 需要时间)
- 打表
pow(p,k,m)
,需要用的时候不重复算
class Solution:
def subStrHash(self, s: str, p: int, m: int, k: int, hashValue: int) -> str:
n,hv,idx,pk = len(s),0,-1,[pow(p,i,m) for i in range(k+1)]
for i in range(n-1,-1,-1):
hv = (hv * p + ord(s[i]) - 96) % m
if i + k < n:hv = (hv - pk[k] * (ord(s[i + k]) - 96)) % m
if hv == hashValue:idx = i
return s[idx:idx+k]
5995. 字符串分组
没写出来QAQ,看一下大神的代码吧(dfs+状压)
class Solution:
def groupStrings(self, words: List[str]) -> List[int]:
vis = Counter()
exist = Counter()
cur = 0
groups = 0
max_group = 0
def try_mask(mask):
if exist[mask] > 0 and vis[mask] == 0:
dfs(mask)
def dfs(mask):
nonlocal cur
vis[mask] = 1
cur += exist[mask]
for i in range(26):
if mask & (1 << i):
try_mask(mask ^ (1 << i))
for j in range(26):
if not (mask & (1 << j)):
try_mask(mask ^ (1 << i) ^ (1 << j))
else:
try_mask(mask | (1 << i))
for word in words:
cnt = Counter(word)
mask = 0
for i in range(26):
if cnt[chr(ord('a') + i)] != 0:
mask |= 1 << i
exist[mask] += 1
for mask in exist.keys():
if vis[mask] == 0:
cur = 0
dfs(mask)
groups += 1
if cur > max_group:
max_group = cur
return [groups, max_group]
总结
T3卡常,不停地优化有点考验耐心。。
T4较难,状压还是我的短板,还需要继续学习
前三题【三行】+【四行】+【六行】,pythonic之路,路遥且长!