代碼隨想錄算法訓練營Day59|110.字符串接龍、105.有向圖的完全可達性、106.島嶼的周長

字符串接龍

110. 字符串接龍 (kamacoder.com)

主要參考代碼隨想錄?代碼隨想錄 (programmercarl.com)

目標:得到從beginStr轉變為endStr所需的最少步數

過程:每次變換一個字母,每次變換的結果要在strList中。

對于一個圖來說,相當于我們有1個起點beginStr和一個終點endStr,以及strList中的N個字符串,然后我們需要找到路徑來使得beginStr變成endStr,將beginStr連接到endStr的路徑即為變化的過程,我們要最小化這個過程。

這里有兩個問題:

  1. 圖中的線是如何連在一起的。
  2. 如何確定當前路徑最短。

對于線的連接,我們注意到每次只能變換一個字符,即我們需要判斷是一個目標字符串與源字符串是否相差一個字符,若相差一個字符,則他們之間是連通的。

而判斷路徑最短,考慮使用廣度優先算法,只要搜索到了結果,那得到的一定是最短路徑,此外,注意這里計算的最短路徑不是線的數目,而是節點的數目。

代碼隨想錄里有兩個點能方便計算:一是無向圖需要標志位,來標記節點是否走過,使用set來檢查字符串是否出現在字符串集合中較快。二是利用哈希表來映射字符串和路徑長度。

具體代碼如下,和代碼隨想錄中結果一樣。

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <unordered_map>
#include <queue>
using namespace std;int main(){int N;cin>>N;                  // 輸入字符串數量 Nunordered_set<string> strSet;  // 創建一個無序集合存儲所有字符串string beginStr, endStr, str;cin >> beginStr >>endStr;      // 輸入起始字符串和目標字符串for(int i = 0; i < N; i++){cin>>str;                  // 輸入 N 個字符串strSet.insert(str);        // 將字符串插入集合}unordered_map<string , int> visitMap; // 創建一個無序映射記錄字符串和對應的路徑長度queue<string> Queue;                 // 創建一個隊列用于 BFSQueue.push(beginStr);                // 將起始字符串入隊列visitMap.insert(pair<string,int>(beginStr, 1)); // 起始字符串路徑長度為 1while(!Queue.empty()){               // 當隊列不為空時進行 BFSstring word = Queue.front();     // 獲取隊列首部的字符串Queue.pop();int path = visitMap[word];       // 獲取該字符串的路徑長度for(int i = 0;i < word.size();i++){ // 遍歷字符串的每個字符string newWord = word;       // 創建一個新字符串,用于修改字符for(int j = 0; j < 26; j++){ // 遍歷 'a' 到 'z',ASCII碼newWord[i] = 'a' + j;    // 修改字符串的一個字符if(newWord == endStr){   // 如果新字符串是目標字符串cout<<path + 1<<endl; // 輸出路徑長度并結束程序return 0;}if(strSet.find(newWord)!= strSet.end() && visitMap.find(newWord) == visitMap.end()){// 如果新字符串在集合中且未被訪問過visitMap.insert(pair<string,int>(newWord,path + 1)); // 記錄新字符串和路徑長度Queue.push(newWord); // 將新字符串入隊列}}}}cout<< 0 <<endl; // 如果沒有找到路徑,輸出 0return 0;
}

對每個字符串,長度定位L,在BFS的過程中,每個字符串都可能被訪問一次,每個源字符串的每個字符都有修改的可能,共有26*L次操作,由于每個字符串只被訪問一次,因此總的時間復雜度為O(N*26*L)。

對空間復雜度,主要需要一個集合、一個哈希表及一個隊列,空間復雜度都為O(N*L),總體空間復雜度為O(N*L)。

有向圖的完全可達性

用廣度優先搜索,對1的每個可達點進行遍歷,并將可達點加入set,最后判斷set的長度是否等于節點數即可。

#include <iostream>
#include <vector>
#include <unordered_set>
#include<queue>
using namespace std;int main(){int N,K;cin>>N>>K;                  // 輸入節點總數 N 和邊的總數 Kvector<vector<int>> dirgraph(K,vector<int>(2,0)); // 創建一個二維向量,用于存儲有向圖的邊for(int i = 0 ; i < K; i++){cin>>dirgraph[i][0]>>dirgraph[i][1]; // 輸入每條邊的起始節點和終止節點}unordered_set<int> visited; // 創建一個無序集合,用于存儲已訪問的節點visited.insert(1);          // 將起始節點 1 加入已訪問集合queue<int> Queue;           // 創建一個隊列,用于 BFSQueue.push(1);              // 將起始節點 1 加入隊列while(!Queue.empty()){       // 當隊列不為空時進行 BFSint x = Queue.front();   // 獲取隊列首部的節點Queue.pop();             // 出隊列for(int i = 0; i < K;i++){ // 遍歷所有的邊if(dirgraph[i][0] == x && visited.find(dirgraph[i][1]) == visited.end()) {// 如果邊的起始節點是 x 并且終止節點未被訪問過visited.insert(dirgraph[i][1]); // 將終止節點加入已訪問集合Queue.push(dirgraph[i][1]);     // 將終止節點加入隊列}}}if(visited.size()==N)        // 如果已訪問的節點數等于總節點數cout<<1<<endl;else{                        // 否則cout<<-1<<endl;}return 0;
}

算法的時間復雜度為O(N*K),空間復雜度為O(N+K)。

島嶼的周長

emmm,想了半天dfs和bfs,發現并不需要。。。

代碼隨想錄 (programmercarl.com)

遍歷每一個空格,遇到島嶼就計算其上下左右的領域情況,若上下左右為0或超出區域,則是一條邊。遍歷完所有的空格和每個空格的領域,即得到結果。

#include <iostream>
#include <vector>
using namespace std;int result = 0;          // 定義一個全局變量,用于存儲島嶼周長int main() {int N,M;cin>>N>>M;            // 輸入網格的行數 N 和列數 Mvector<vector<int>> graph(N,vector<int>(M)); // 創建一個 N 行 M 列的二維向量,用于存儲網格for(int i = 0; i < N; i++)                     // 遍歷網格的每一行for (int j = 0; j < M; j++)                // 遍歷網格的每一列cin >> graph[i][j];                    // 輸入網格的值for(int i = 0; i < N; i++){                    // 遍歷網格的每一行for(int j = 0; j < M; j++){                // 遍歷網格的每一列if(graph[i][j] == 1){                  // 如果當前單元格是土地if((i + 1) == N || graph[i+1][j] == 0) // 如果下方是網格邊緣或水result++;                       // 結果計數器加 1if((i - 1) == -1 || graph[i-1][j] == 0) // 如果上方是網格邊緣或水result++;                       // 結果計數器加 1if(j + 1 == M || graph[i][j + 1] == 0) // 如果右方是網格邊緣或水result++;                       // 結果計數器加 1if(j - 1 == -1 || graph[i][j - 1] == 0) // 如果左方是網格邊緣或水result++;                       // 結果計數器加 1}}}cout<<result<<endl;  // 輸出島嶼周長return 0;
}

算法的時間復雜度為O(4*N*M),空間復雜度為O(1)。

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

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

相關文章

excel批量修改一列單價的金額并保留1位小數

1.打開表格&#xff0c;要把單價金額變成現在的兩倍&#xff0c;數據如下&#xff1a; 2.把單價這一列粘貼到一個新的sheet頁面&#xff0c;在B2單元格輸入公式&#xff1a;A2*2 然后按enter回車鍵,這時候吧鼠標放到B2單元格右下角&#xff0c;會出現一個黑色的小加號&#xf…

重大更新來襲!!《植物大戰僵尸雜交版V2.1+修改器+融合版》

大家好&#xff01;每個軟件更新總是令人興奮不已。前段時間介紹的《植物大戰僵尸》系列以其獨特的策略玩法和豐富的植物角色&#xff0c;贏得了很多玩家的喜愛。而在今天&#xff0c;這款經典游戲全網最新版本——《植物大戰僵尸&#xff1a;雜交版V2.1》正式推出&#xff0c;…

docker 環境下failed to start lsb故障解決

背景&#xff1a;從深信服超融合遷移虛擬機到VMWARE集群后&#xff0c;遷移后的虛擬機 centos 7 運行systemctl start network ,報錯 Restarting network (via systemctl): Job for network.service failed. See systemctl status network.service and journalctl -xn for d…

Redis組建哨兵模式

主172.17.60.131 從172.17.60.130、172.17.60.129 redis部署 [rootlocalhost app]# tar xf redis-6.2.9.tar.gz [rootlocalhost app]# cd redis-6.2.9/ [rootlocalhost redis-6.2.9]# make MALLOClibc [rootlocalhost redis-6.2.9]# make install PREFIX/usr/local/redis…

Docker 中查看及修改 Redis 容器密碼的實用指南

在使用 Docker 部署 Redis 容器時&#xff0c;有時我們需要查看或修改 Redis 的密碼。本文將詳細介紹如何在 Docker 中查看和修改 Redis 容器的密碼&#xff0c;幫助你更好地管理和維護你的 Redis 實例。 一、查看 Redis 容器密碼 通常在啟動 Redis 容器時&#xff0c;我們會…

構建LangChain應用程序的示例代碼:56、如何實現一個多智能體模擬,其中沒有固定的發言順序。智能體自行決定誰來發言,通過競價機制實現

多智能體分散式發言人選擇 示例展示了如何實現一個多智能體模擬,其中沒有固定的發言順序。智能體自行決定誰來發言,通過競價機制實現。 我們將在下面的示例中展示一場虛構的總統辯論來演示這一過程。 導入LangChain相關模塊 from typing import Callable, Listimport tenac…

正向代理反向代理

nginx的正向代理和反向代理: 正向代理以及緩存配置: 代理:客戶端不再是直接訪問服務端&#xff0c;通過代理服務器訪問服務端。 正向代理&#xff1a;面向客戶端&#xff0c;通過代理服務器的ip地址訪問目標服務端 服務端只知道代理服務器的地址&#xff0c;真正的客戶端ip可以…

【MySQL系列】隱式轉換

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

ctfshow web入門 nodejs

web334 有個文件下載之后改后綴為zip加壓就可以得到兩個文件 一個文件類似于index.php 還有一個就是登錄密碼登錄成功就有flag username:ctfshow password:123456因為 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

產科管理系統 專科電子病歷系統源碼,前后端分離架構,多家醫院產科廣泛運用,系統穩定,功能齊全

產科管理系統 專科電子病歷系統源碼&#xff0c;前后端分離架構&#xff0c;多家醫院產科廣泛運用&#xff0c;系統穩定&#xff0c;功能齊全 產科管理系統&#xff0c;特別是產科信息管理系統&#xff08;Obstetrical Information Management System&#xff0c;簡稱OIMS&…

智能井蓋監測系統:守護城市安全的新防線

? ??在快速發展的現代都市中&#xff0c;井蓋作為連接地上與地下世界的“隱形門”&#xff0c;其安全狀態直接關系到市民的生命財產安全。隨著物聯網、大數據及人工智能技術的飛速發展&#xff0c;智能井蓋監測系統的出現為解決傳統井蓋管理難題提供了創新方案&#xff0…

【算法筆記自學】入門篇(2)——算法初步

4.1排序 自己寫的題解 #include <stdio.h> #include <stdlib.h>void selectSort(int A[], int n) {for(int i 0; i < n - 1; i) { // 修正索引范圍int k i;for(int j i 1; j < n; j) { // 修正索引范圍if(A[j] < A[k]) {k j;}}if (k ! i) { // 僅在…

跨境人最怕的封店要怎么規避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP關聯、無版權售賣、虛假發貨等等&#xff0c;其中IP關聯這個問題導致店鋪被封在跨境商家中簡直是屢見不鮮 IP關聯&#xff0c;是指被海外平臺檢測到多家店鋪開設在同一個站點上的情況。我們知道有些…

賣家必讀:阿里巴巴國際站登錄與入駐全流程

阿里巴巴國際站作為全球最大的B2B電子商務平臺之一&#xff0c;為品牌建立和業務拓展提供了可能。那么跨境賣家如何才能成功登錄和入駐阿里巴巴國際站&#xff1f;本文將講解如何用阿里巴巴國際站網頁版進行登錄&#xff0c;以及阿里巴巴國際站賣家的入駐條件、流程和費用。此外…

統計信號處理基礎 習題解答11-12

題目 證明 的MAP估計量為 其中是一個的矢量, 是一個可逆的p*p的矩陣。也就是說&#xff0c;MAP估計量對可逆的線性變換是可以變換的。 解答 已知的聯合概率密度 且&#xff1a; 現在知道&#xff1a; 那么為了獲得變換后的MAP&#xff0c;首先需要根據求出 根據概率密度變換…

2024年軟件測試面試題,精選100+,附答案+文檔

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 點擊文末小卡片 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Part1 1、你的測試職業發展是什么&#xff1f; 測試經驗越多&#xff0c;測試能力越高。所以我…

C++入門 容器適配器 / stack queue模擬實現

目錄 容器適配器 deque的原理介紹 stack模擬實現 queue模擬實現 priority_queue模擬實現 仿函數 容器適配器 適配器是一種設計模式(設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總 結)&#xff0c;該種模式是將一個類的接口轉換成客戶希望…

深度學習Week19——學習殘差網絡和ResNet50V2算法

文章目錄 深度學習Week18——學習殘差網絡和ResNet50V2算法 一、前言 二、我的環境 三、論文解讀 3.1 預激活設計 3.2 殘差單元結構 四、模型復現 4.1 Residual Block 4.2 堆疊Residual Block 4.3. ResNet50V2架構復現 一、前言 &#x1f368; 本文為&#x1f517;365天深度學…

Kubernetes k8s 命名空間 namespace 介紹以及應用 資源限額配置

目錄 命名空間 什么是命名空間&#xff1f; namespace應用場景 namespacs使用案例分享 namespace資源限額 文檔中的YAML文件配置直接復制粘貼可能存在格式錯誤&#xff0c;故實驗中所需要的YAML文件以及本地包均打包至網盤 鏈接&#xff1a;https://pan.baidu.com/s/1qv8Tc…

Python中異步事件觸發

1、問題背景 在Python中&#xff0c;我想創建一個由事件生成控制流程的類結構。為此&#xff0c;我做了以下工作&#xff1a; class MyEvent: EventName_FunctionName {}classmethoddef setup(cls, notificationname, functionname):if notificationname in MyEvent.EventN…