【算法】力扣第 278 场周赛(最短代码)

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小时。。。思路如下:

  1. 滑动窗口求子串
  2. 不考虑mod,hash值可以这样转移:
    1. 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 hashlee=val(l)p0+val(e)p1+val(e)p2
    2. 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 hasheet=val(e)p0+val(e)p1+val(t)p2
    3. 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 hasheet=(hasheetval(l)p0)//p+val(t)p2
  3. 考虑mod,除法不满足取余的恒等性,可以采取倒序(乘法满足取余恒等)
  4. 乘法: 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 hashlee=(hasheetval(t)p2)p+val(l)p0

考虑优化,思路如下:

  1. 不取子串(切片/substr之类的会产生一个新的 string,构造新 string 需要时间)
  2. 打表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之路,路遥且长!

猜你喜欢

转载自blog.csdn.net/weixin_45825073/article/details/122752820