暑假算法日記第四天

目標?:刷完靈神專題訓練算法題單

階段目標📌:【算法題單】滑動窗口與雙指針

LeetCode題目:

  • 2953. 統計完全子字符串
  • 1016. 子串能表示從 1 到 N 數字的二進制串

其他:

今日總結
往期打卡


2953. 統計完全子字符串

跳轉: 2953. 統計完全子字符串

學習: 題解

問題:

給你一個字符串 word 和一個整數 k

如果 word 的一個子字符串 s 滿足以下條件,我們稱它是 完全字符串:

  • s 中每個字符 恰好 出現 k 次。
  • 相鄰字符在字母表中的順序 至多 相差 2 。也就是說,s 中兩個相鄰字符 c1c2 ,它們在字母表中的位置相差 至多2

請你返回 word完全 子字符串的數目。

子字符串 指的是一個字符串中一段連續 非空 的字符序列。

思路:

從k長的窗口開始,2k,3k長依此遍歷求字典值全是k的情況計數不難想
因為相鄰差至多為2,所以遍歷整個數組要維護窗口相鄰差最值
用分組循環從邊界切開分段求能簡化計算同時降低復雜度

一共26個小寫字母,所以哪怕長度大于26 * k也不需要再遍歷
每個字符k次除了直接遍歷一遍字典還可以維護字典中值為k的數量

復雜度:

  • 時間復雜度: O(26?4?n)O(26*4*n)O(26?4?n)
  • 空間復雜度: O(26)O(26)O(26)

代碼:

class Solution:def countCompleteSubstrings(self, word: str, k: int) -> int:def f(s:list) -> int:ans = 0for size in range(1,27):    # 26個字母,所以最多不會超過26,后面的都不用算j = size * kif j > len(s):breakcnt = Counter(s[:j])count = 0for i in cnt.values():if i == k:count += 1if count == size:   # 因為和是j,所以統計cnt里的k對上size即可ans += 1for i,ch in enumerate(s[j:]):if cnt[ch] == k:count -= 1cnt[ch] = cnt.get(ch,0) + 1if cnt[ch] == k:count += 1if cnt[s[i]] == k:count -= 1cnt[s[i]] -= 1if cnt[s[i]] == k:count += 1if count == size:ans += 1return ansi = ans = 0n = len(word)while i in range(n):    # 分組循環start = ii += 1while i < n and abs(ord(word[i])-ord(word[i - 1])) <= 2:i += 1ans += f(word[start:i])return ans

1016. 子串能表示從 1 到 N 數字的二進制串

跳轉: 1016. 子串能表示從 1 到 N 數字的二進制串

學習: 題解

問題:

給定一個二進制字符串 s 和一個正整數 n,如果對于 [1, n] 范圍內的每個整數,其二進制表示都是 s子字符串 ,就返回 true,否則返回 false

子字符串 是字符串中連續的字符序列。

思路:

對于去除前導0的二進制串,更長的串集合整體右移一位完全可以覆蓋更短的串
于是可以用滑動窗口遍歷最長的串集合
但由于n不一定是2的冪-1或-2,即最長的串集合一般不全,所以確保不漏,除了最長的次長的二進制串也要遍歷

即以n的二進制長-1為k,在s上求 k 長和 k+1 長的滑動窗口

  • 區間 [2k,n][2^k,n][2k,n] 內的二進制數的長度均為 k+1k+1k+1,這有 n?2k+1n?2^k+1n?2k+1 個,所以應滿足 m≥k+1+(n?2k+1?1)=n?2k+k+1m≥k+1+(n?2^k+1?1)=n?2^k+k+1mk+1+(n?2k+1?1)=n?2k+k+1
  • 區間 [2k?1,2k?1][2^{k?1},2^k?1][2k?1,2k?1] 內的二進制數的長度均為 k,這有 2k?12^{k?1}2k?1 個,所以應滿足 m≥k+(2k?1?1)=2k?1+k?1m≥k+(2^{k?1}?1)=2^{k?1}+k?1mk+(2k?1?1)=2k?1+k?1

復雜度:

  • 時間復雜度: O(m)O(m)O(m)
  • 空間復雜度: O(min(m,n))O(min(m,n))O(min(m,n))

代碼:

# class Solution:
#     def queryString(self, s: str, n: int) -> bool:
#         set_ = set()
#         s = list(map(int,s))
#         for i,num in enumerate(s):
#             if num == 0: continue
#             j = i + 1
#             while num <= n:
#                 set_.add(num)
#                 if j == len(s): break
#                 num = num << 1 | s[j]
#                 j += 1
#         return len(set_) == nclass Solution:def queryString(self, s: str, n: int) -> bool:if n == 1:return "1" in sm = len(s)k = n.bit_length() - 1if m < max(k + 1 + (n - (1 << k)), k + (1 << k - 1) - 1):return Falsedef check(k: int, lower: int, upper: int) -> bool:if lower > upper:return Trueif k == 1:return "1" in sseen = set()bits = list(map(int, s[k - 1 :]))num = int(s[: k - 1], 2)mask = (1 << k - 1) - 1# 滑動窗口只找k長的二進制值即可for i in bits:num = ((num & mask) << 1) + iif lower <= num <= upper:seen.add(num)return len(seen) == upper - lower + 1# return check(k + 1, 1 << k, n) and check(k, 1 << k - 1, (1 << k) - 1)# 可以進一步縮小范圍,不必計算全部的2^{k-1}到2^k-1,因為會和2^k到n有重復# return check(k + 1, 1 << k, n) and check(k, (n >> 1) + 1, (1 << k) - 1)# 實測用 n//2 性能更優return check(k + 1, 1 << k, n) and check(k, n // 2 + 1, (1 << k) - 1)

總結

繼續練習定長滑動窗口,學習了分組循環和python二進制操作

往期打卡

暑假算法日記第三天

暑假算法日記第二天

暑假算法日記第一天

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88192.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88192.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88192.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 常用命令大全(2025簡明版)

&#x1f9ed; 一、文件和目錄操作命令說明ls列出目錄內容ls -l以列表形式顯示&#xff08;含權限&#xff09;cd /path切換目錄pwd顯示當前路徑mkdir dir創建目錄mkdir -p dir/subdir遞歸創建目錄rm file刪除文件rm -r dir刪除目錄&#xff08;遞歸&#xff09;rm -rf dir強制…

React Ref 指南:原理、實現與實踐

前言 React Ref&#xff08;引用&#xff09;是React中一個強大而重要的概念&#xff0c;它為我們提供了直接訪問DOM元素或組件實例的能力。雖然React推崇聲明式編程和數據驅動的理念&#xff0c;但在某些場景下&#xff0c;我們仍需要直接操作DOM或訪問組件實例。本文將深入探…

4.權重衰減(weight decay)

4.1 手動實現權重衰減 import torch from torch import nn from torch.utils.data import TensorDataset,DataLoader import matplotlib.pyplot as plt def synthetic_data(w,b,num_inputs):Xtorch.normal(0,1,size(num_inputs,w.shape[0]))yXwbytorch.normal(0,0.1,sizey.shap…

OpenCV開發-初始概念

第一章 OpenCV核心架構解析1.1 計算機視覺的基石OpenCV&#xff08;Open Source Computer Vision Library&#xff09;作為跨平臺計算機視覺庫&#xff0c;自1999年由Intel發起&#xff0c;已成為圖像處理領域的標準工具。其核心價值體現在&#xff1a;跨平臺性&#xff1a;支持…

LeetCode 930.和相同的二元子數組

給你一個二元數組 nums &#xff0c;和一個整數 goal &#xff0c;請你統計并返回有多少個和為 goal 的 非空 子數組。 子數組 是數組的一段連續部分。 示例 1&#xff1a; 輸入&#xff1a;nums [1,0,1,0,1], goal 2 輸出&#xff1a;4 解釋&#xff1a; 有 4 個滿足題目要求…

【論文解讀】Referring Camouflaged Object Detection

論文信息 論文題目&#xff1a;Referring Camouflaged Object Detection 論文鏈接&#xff1a;https://arxiv.org/pdf/2306.07532 代碼鏈接&#xff1a;https://github.com/zhangxuying1004/RefCOD 錄用期刊&#xff1a;TPAMI 2025 論文單位&#xff1a;南開大學 ps&#xff1a…

Spring中過濾器和攔截器的區別及具體實現

在 Spring 框架中&#xff0c;過濾器&#xff08;Filter&#xff09; 和 攔截器&#xff08;Interceptor&#xff09; 都是用于處理 HTTP 請求的中間件&#xff0c;但它們在作用范圍、實現方式和生命周期上有顯著區別。以下是詳細對比和實現方式&#xff1a;核心區別特性過濾器…

CANFD 數據記錄儀在新能源汽車售后維修中的應用

一、前言隨著新能源汽車市場如火如荼和新能源汽車電子系統的日益復雜&#xff0c;傳統維修手段在面對復雜和偶發故障時往往捉襟見肘&#xff0c;CANFD 數據記錄儀則憑借其獨特優勢&#xff0c;為售后維修帶來新的解決方案。二、 詳細介紹在新能源汽車領域&#xff0c;CANFD 數據…

某當CRM XlsFileUpload存在任意文件上傳(CNVD-2025-10982)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 前言: 我們建立了一個更多,更全的…

自然語言處理與實踐

文章目錄Lesson1&#xff1a;Introduction to NLP、NLP 基礎與文本預處理1.教材2.自然語言處理概述(1)NLP 的定義、發展歷程與應用場景(2)NLP 的主要任務&#xff1a;分詞、詞性標注、命名實體識別、句法分析等2.文本預處理3.文本表示方法&#xff1a;詞向量表示/詞表征Lesson2…

CSS揭秘:9.自適應的橢圓

前置知識&#xff1a;border-radius 用法前言 本篇目標是實現一個橢圓&#xff0c;半橢圓&#xff0c;四分之一橢圓。 一、圓形和橢圓 當我們想實現一個圓形時&#xff0c;通常只要指定 border-radius 為 width/height 的一半就可以了。 當我們指定的border-radius的值超過了 w…

善用關系網絡:開源AI大模型、AI智能名片與S2B2C商城小程序賦能下的成功新路徑

摘要&#xff1a;本文聚焦于關系在個人成功中的關鍵作用&#xff0c;指出關系即財富&#xff0c;善用關系、拓展人脈是成功的重要途徑。在此基礎上&#xff0c;引入開源AI大模型、AI智能名片以及S2B2C商城小程序等新興技術工具&#xff0c;探討它們如何助力個體在復雜的關系網絡…

2025年滲透測試面試題總結-2025年HW(護網面試) 34(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 34 一、網站信息收集 核心步驟與工具 二、CDN繞過與真實IP獲取 6大實戰方法 三、常…

螢石全新上線企業AI對話智能體,開啟IoT人機交互新體驗

一、什么是螢石AI對話智能體&#xff1f;如何讓設備聽得到、聽得懂&#xff1f;這次螢石發布的AI對話Agent&#xff0c;讓設備能進行自然、流暢、真人感的AI對話智能體&#xff0c;幫助開發者打造符合業務場景的AI對話智能體能力&#xff0c;實現全雙工、實時打斷、可擴展、對話…

智紳科技:以科技為翼,構建養老安全守護網

隨著我國老齡化進程加速&#xff0c;2025年60歲以上人口突破3.2億&#xff0c;養老安全問題成為社會關注的焦點。智紳科技作為智慧養老領域的領軍企業&#xff0c;以“科技賦能健康&#xff0c;智慧守護晚年”為核心理念&#xff0c;通過人工智能、物聯網、大數據等技術融合&am…

矩陣系統源碼部署實操指南:搭建全解析,支持OEM

矩陣系統源碼部署指南矩陣系統是一種高效的數據處理框架&#xff0c;適用于大規模分布式計算。以下為詳細部署步驟&#xff0c;包含OEM支持方案。環境準備確保服務器滿足以下要求&#xff1a;操作系統&#xff1a;Linux&#xff08;推薦Ubuntu 18.04/CentOS 7&#xff09;硬件配…

基于python的個人財務記賬系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

從 CODING 停服到極狐 GitLab “接棒”,軟件研發工具市場風云再起

CODING DevOps 產品即將停服的消息&#xff0c;如同一顆重磅炸彈&#xff0c;在軟件研發工具市場炸開了鍋。從今年 9 月開始&#xff0c;CODING 將陸續下線其 DevOps 產品&#xff0c;直至 2028 年 9 月 30 日完全停服。這一變動讓眾多依賴 CODING 平臺的企業和個人開發者陷入了…

#滲透測試#批量漏洞挖掘#HSC Mailinspector 任意文件讀取漏洞(CVE-2024-34470)

免責聲明 本教程僅為合法的教學目的而準備&#xff0c;嚴禁用于任何形式的違法犯罪活動及其他商業行為&#xff0c;在使用本教程前&#xff0c;您應確保該行為符合當地的法律法規&#xff0c;繼續閱讀即表示您需自行承擔所有操作的后果&#xff0c;如有異議&#xff0c;請立即停…

深入解析C++驅動開發實戰:優化高效穩定的驅動應用

深入解析C驅動開發實戰&#xff1a;優化高效穩定的驅動應用 在現代計算機系統中&#xff0c;驅動程序&#xff08;Driver&#xff09;扮演著至關重要的角色&#xff0c;作為操作系統與硬件設備之間的橋梁&#xff0c;驅動程序負責管理和控制硬件資源&#xff0c;確保系統的穩定…