Leetcode刷題詳解——環繞字符串中唯一的子字符串

1. 題目鏈接:467. 環繞字符串中唯一的子字符串

2. 題目描述:

定義字符串 base 為一個 "abcdefghijklmnopqrstuvwxyz" 無限環繞的字符串,所以 base 看起來是這樣的:

  • "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".

給你一個字符串 s ,請你統計并返回 s 中有多少 不同****非空子串 也在 base 中出現。

示例 1:

輸入:s = "a"
輸出:1
解釋:字符串 s 的子字符串 "a" 在 base 中出現。

示例 2:

輸入:s = "cac"
輸出:2
解釋:字符串 s 有兩個子字符串 ("a", "c") 在 base 中出現。

示例 3:

輸入:s = "zab"
輸出:6
解釋:字符串 s 有六個子字符串 ("z", "a", "b", "za", "ab", and "zab") 在 base 中出現。

提示:

  • 1 <= s.length <= 105
  • s 由小寫英文字母組成

3. 解法(動態規劃):

3.1 算法思路:

1. 狀態表示:

dp[i]表示:以 i位置的元素為結尾的所有子串里面,有多少個在 base中出現過

2. 狀態轉移方程:

對于 dp[i],我們可以根據子串的長度劃分為兩類:

  1. 子串的長度等于1:此時這一個字符會出現在 base
  2. 子串的長度大于1:如果 i位置的字符和 i-1位置上的字符組合后,出現在 base中的話,那么 dp[i-1]里面的所有子串后面填上一個 s[i]依舊在 base中出現,因此 dp[i]=dp[i-1]

綜上,dp[i]=1+dp[i-1],其中 dp[i-1]是否加上需要先做一下判斷

3. 初始化:

將表里面的值都初始化為1

4. 填表順序:

從左往右

5. 返回值:

這里不能直接返回 dp表里面的和,因為會又重復的結果。在返回之前,我們需要先去重:

  1. 相同字符結尾的 dp值,我們僅需要保留最大的即可,其余 dp值對應的子串都可以在最大的里面找到
  2. 可以創建一個大小為26的數組,統計所有字符結尾的最大 dp
  3. 最后返回數組中所有元素的和即可

3.2 C++算法代碼:

class Solution {
public:int findSubstringInWraproundString(string s) {// 獲取字符串長度int n = s.size();// 初始化動態規劃數組,dp[i]表示以第i個字符結尾的最長連續子串的長度vector<int> dp(n, 1);// 遍歷字符串,從第二個字符開始for (int i = 1; i < n; i++) {// 如果當前字符與前一個字符相差1或者當前字符是'z'且前一個字符是'a',則說明可以組成連續子串if (s[i] - 1 == s[i - 1] || (s[i - 1] == 'z' && s[i] == 'a')) {// 更新dp數組dp[i] = dp[i - 1] + 1;}}// 初始化哈希數組,用于記錄每個字符作為子串末尾時的最大長度int hash[26] = {0};// 遍歷dp數組,更新哈希數組for (int i = 0; i < n; i++) {hash[s[i] - 'a'] = max(hash[s[i] - 'a'], dp[i]);}// 計算所有子串長度之和int sum = 0;for (auto x : hash) sum += x;return sum;}
};

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

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

相關文章

卷積之后通道數為什么變了

通道數增多與卷積之后得到的圖像特征數量有關 卷積層的作用本來就是把輸入中的特征分離出來變成新的 feature map&#xff0c;每一個輸出通道就是一個卷積操作提取出來的一種特征。在此過程中ReLU激活起到過濾的作用&#xff0c;把負相關的特征點去掉&#xff0c;把正相關的留…

C++:vector增刪查改模擬實現

C:vector增刪查改模擬實現 前言一、迭代器1.1 非const迭代器&#xff1a;begin()、end()1.2 const迭代器&#xff1a;begin()、end() 二、構造函數、拷貝構造函數、賦值重載、析構函數模擬實現2.1 構造函數2.1.1 無參構造2.1.2 迭代器區間構造2.1.3 n個值構造 2.2 拷貝構造2.3 …

vue路由導航守衛(全局守衛、路由獨享守衛、組件內守衛)

目錄 一、什么是Vue路由導航守衛&#xff1f; 二、全局守衛 1、beforeEach 下面是一個beforeEach的示例代碼&#xff1a; 2、beforeResolve 下面是一個beforeResolve的示例代碼&#xff1a; 3、afterEach 下面是一個afterEach的示例代碼&#xff1a; 三、路由獨享守衛…

Shell - 學習筆記 - 1.14 - 如何編寫自己的Shell配置文件(配置腳本)?

第1章 Shell基礎(開胃菜) 14 - 如何編寫自己的Shell配置文件(配置腳本)? 學習了《Shell配置文件的加載》一節,讀者應該知道 Shell 在登錄和非登錄時都會加載哪些配置文件了。對于普通用戶來說,也許 ~/.bashrc 才是最重要的文件,因為不管是否登錄都會加載該文件。 我們…

【數據處理】NumPy數組的合并操作,如何將numpy數組進行合并?

&#xff0c;NumPy中的合并操作是指將兩個或多個數組合并成一個數組的操作。這種操作可以通過不同的函數來實現。 一、橫向合并&#xff08;水平合并&#xff09; 橫向合并是指將兩個具有相同行數的數組按列方向合并成一個數組的操作。在NumPy中&#xff0c;可以使用hstack()…

044:vue中引用json數據的方法

第044個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

多相Buck的工作原理

什么是多相Buck電源&#xff1f; 多相電源控制器是一種通過同時控制多個電源相位的設備&#xff0c;以提供穩定的電力供應。相位是指電源中的電流和電壓波形。多相控制器的設計旨在最大程度地減小電力轉換系統的紋波&#xff0c;并提高整體能效。它通常包含一系列的功率級聯&a…

我的創作紀念日1024天紀念

機緣 經歷的1024天&#xff0c;突然有一種驚奇&#xff0c;日子一天天過&#xff0c;有種恍惚的感覺 收獲 從最開始的隨筆&#xff0c;慢慢向著筆記總結轉變&#xff0c;不經意間積累了好多 憧憬 雖不知最終會怎樣發展&#xff0c;但堅持與向前是一定的&#xff0c;未來一…

結構化布線系統

滿足下列需求&#xff1a; 1.標準化&#xff1a;國際、國家標準。 2.實用性&#xff1a;針對實際應用的需要和特點來建設系統。 3.先進性&#xff1a;采用國際最新技術。5-10年內技術不落后。 4.開放性&#xff1a;整個系統的開放性。 5.結構化、層次化&#xff1a;易于管理和維…

Matplotlib數據可視化

繪圖基礎語法 &#xff11; 創建畫布并且創建子圖 首先創建一個空白的畫布&#xff0c;并且可以將畫布分為幾個部分&#xff0c;這樣就可以在同一附圖上繪制多個圖像。 plt.figure 創建一個空白畫布&#xff0c;可以指定畫布大小、像素 figure.add_subplot 創建并且選中子…

docker鏡像、容器管理與遷移

鏡像管理 搜索鏡像&#xff1a; 這種方法只能用于官方鏡像庫 搜索基于 centos 操作系統的鏡像 # docker search centos 按星級搜索鏡像&#xff1a; 查找 star 數至少為 100 的鏡像&#xff0c;默認不加 s 選項找出所有相關 ubuntu 鏡像&#xff1a; …

【web安全】文件讀取與下載漏洞

前言 菜某整理僅供學習&#xff0c;有誤請賜教。 概念 個人理解&#xff1a;就是我們下載一個文件會傳入一個參數&#xff0c;但是我們可以修改參數&#xff0c;讓他下載其他的文件。因為是下載文件&#xff0c;所以我們可以看到文件里面的源碼&#xff0c;內容。 文件讀取…

Python嗅探和解析網絡數據包

網絡工具解釋 Scapy是Python2和Python3都支持的庫。 它用于與網絡上的數據包進行交互。 它具有多種功能&#xff0c;通過這些功能我們可以輕松偽造和操縱數據包。 通過 scapy 模塊&#xff0c;我們可以創建不同的網絡工具&#xff0c;如 ARP Spoofer、網絡掃描儀、數據包轉儲器…

swiftUi——顏色

在SwiftUI中&#xff0c;您可以使用Color結構來表示顏色。Color可以直接使用預定義的顏色&#xff0c;例如.red、.blue、.green等&#xff0c;也可以使用自定義的RGB值、十六進制顏色代碼或者系統提供的顏色。 1. 預定義顏色 Text("預定義顏色").foregroundColor(.…

Swing程序設計(9)復選框,下拉框

文章目錄 前言一、復選框二、下拉框總結 前言 該篇文章簡單介紹了Java中Swing組件里的復選框組件、列表框組件、下拉框組件&#xff0c;這些在系統中都是常用的組件。 一、復選框 復選框&#xff08;JCheckBox&#xff09;在Swing組件中的使用也非常廣泛&#xff0c;一個方形方…

Albumentations(Augmentation Transformations)

Albumentations&#xff08;Augmentation Transformations&#xff09; Albumentations&#xff08;Augmentation Transformations&#xff09;是一個用于圖像數據增強&#xff08;數據增廣&#xff09;的Python包。它提供了豐富的圖像增強技術&#xff0c;用于訓練機器學習模…

hadoop安裝與配置-shell腳本一鍵安裝配置(集群版)

文章目錄 前言一、安裝準備1. 搭建集群 二、使用shell腳本一鍵安裝1. 復制腳本2. 增加執行權限3. 分發腳本4. 執行腳本5. 加載用戶環境變量 三、啟動與停止1. 啟動/停止hadoop集群(1) 復制hadoop集群啟動腳本(2) 增加執行權限(3) 啟動hadoop集群(4) 停止hadoop集群(5) 重啟hado…

智慧社區前景無限,科技引領未來發展

社區是城鎮化發展的標志&#xff0c;作為人類現代社會的生活的基本圈子&#xff0c;是人類生活離不開的地方&#xff0c;社區人口密度大、車輛多&#xff0c;管理無序&#xff0c;社區的膨脹式發展多多少少帶來一定的管理上的缺失。社區作為智慧城市建設的重要一環&#xff0c;…

編譯基于LIO-SAM的liorf“Large velocity, reset IMU-preintegration!“

使用LIO-SAM修改的代碼liorf&#xff08;因自己使用的IMU傳感器是 6-axis ouster&#xff09;&#xff1a; LIO-SAM代碼連接&#xff1a; https://github.com/TixiaoShan/LIO-SAM liorf代碼連接&#xff1a; https://github.com/YJZLuckyBoy/liorf 編譯運行出現錯誤&#…

eve-ng山石網科HillStone鏡像部署

HillStone 部署 author&#xff1a;leadlife data&#xff1a;2023/12/4 mains&#xff1a;EVE-ng HillStone 鏡像部署 - use hillstone-sg6000 default&#xff1a;hillstone/hillstone 傳輸 scp hillstone-sg6000.zip root192.168.3.130:/opt/unetlab/addons/qemu/部署 cd …