按字典序排列最小的等效字符串

文章目錄

    • 題目
    • 思路
    • 解題過程
    • Python代碼
    • C代碼
    • 復雜度

題目

給出長度相同的兩個字符串s1 和 s2 ,還有一個字符串 baseStr 。
其中 s1[i] 和 s2[i] 是一組等價字符。
舉個例子,如果 s1 = “abc” 且 s2 = “cde”,那么就有 ‘a’ == ‘c’, ‘b’ == ‘d’, ‘c’ == ‘e’。
等價字符遵循任何等價關系的一般規則:

  • 自反性 :‘a’ == ‘a’
  • 對稱性 :‘a’ == ‘b’ 則必定有 ‘b’ == ‘a’
  • 傳遞性 :‘a’ == ‘b’ 且 ‘b’ == ‘c’ 就表明 ‘a’ == ‘c’

例如, s1 = “abc” 和 s2 = “cde” 的等價信息和之前的例子一樣,那么 baseStr = “eed” , “acd” 或 “aab”,這三個字符串都是等價的,而 “aab” 是 baseStr 的按字典序最小的等價字符串

利用 s1 和 s2 的等價信息,找出并返回 baseStr 的按字典序排列最小的等價字符串。

示例 1:
輸入:s1 = "parker", s2 = "morris", baseStr = "parser"
輸出:"makkek"
解釋:根據 A 和 B 中的等價信息,我們可以將這些字符分為 [m,p], [a,o], [k,r,s], [e,i] 共 4 組。每組中的字符都是等價的,并按字典序排列。所以答案是 "makkek"。示例 2:
輸入:s1 = "hello", s2 = "world", baseStr = "hold"
輸出:"hdld"
解釋:根據 A 和 B 中的等價信息,我們可以將這些字符分為 [h,w], [d,e,o], [l,r] 共 3 組。所以只有 S 中的第二個字符 'o' 變成 'd',最后答案為 "hdld"。示例 3:
輸入:s1 = "leetcode", s2 = "programs", baseStr = "sourcecode"
輸出:"aauaaaaada"
解釋:我們可以把 A 和 B 中的等價字符分為 [a,o,e,r,s,c], [l,p], [g,t] 和 [d,m] 共 4 組,因此 S 中除了 'u' 和 'd' 之外的所有字母都轉化成了 'a',最后答案為 "aauaaaaada"。

提示:

  • 1 <= s1.length, s2.length, baseStr <= 1000
  • s1.length == s2.length
  • 字符串s1, s2, and baseStr 僅由從 ‘a’ 到 ‘z’ 的小寫英文字母組成。

思路

a == b,b == c,c == d,則a與d存在連通性,查找連通分量可以使用并查集。
注意:在合并s1[i]和s2[i]時,兩個字母的祖先字典序排列較小的作為新的公共祖先

在這里插入圖片描述
在這里插入圖片描述

解題過程

1、初始化并查集,因為總共只有26個小寫字母,所以并查集長度為26,每個字母的祖先初始化為其本身。
2、關聯s1與s2中的字母。
3、關聯后再次更新并查集,確保每個字母的祖先最小。
4、遍歷baseStr,生成結果。

Python代碼

def search(node, parent):# 查找祖先節點if node == parent[node]:return nodeparent[node] = search(parent[node], parent)return parent[node]def union(node1, node2, parent):# 關聯node1、node2ancestor1 = search(node1, parent)ancestor2 = search(node2, parent)if ancestor1 < ancestor2:parent[ancestor2] = ancestor1else:parent[ancestor1] = ancestor2class Solution:def smallestEquivalentString(self, s1: str, s2: str, baseStr: str) -> str:# 初始化并查集,所有字符(字母)的父節點都是本身parent = list(range(26))# 關聯s1和s2中的每個字母n = len(s1)for i in range(n):a = ord(s1[i]) - ord("a")b = ord(s2[i]) - ord("a")union(a, b, parent)# 更新并查集for i in range(26):search(i, parent)# 生成結果ans = ""for c in baseStr:ans += chr(ord("a") + parent[ord(c) - ord("a")])return ans

C代碼

typedef struct {int* parent;
} UnionFind;UnionFind* createUnionFind(int n) {// 初始化并查集UnionFind* uf = malloc(sizeof(UnionFind));uf->parent = malloc(n * sizeof(int));for (int i = 0; i < n; i++) {uf->parent[i] = i;}return uf;
}int find(int x, UnionFind* uf) {// 查找祖先節點if (uf->parent[x] != x) {uf->parent[x] = find(uf->parent[x], uf);}return uf->parent[x];
}void unite(int x, int y, UnionFind* uf) {x = find(x, uf);y = find(y, uf);if (x == y) return;if (x > y) {uf->parent[x] = y;} else {uf->parent[y] = x;}}char* smallestEquivalentString(char* s1, char* s2, char* baseStr) {// 初始化并查集UnionFind* uf = createUnionFind(26);for (int i = 0; s1[i]; i++) {unite(s1[i] - 'a', s2[i] - 'a', uf);}for (int i = 0; baseStr[i]; i++) {baseStr[i] = 'a' + find(baseStr[i] - 'a', uf);}free(uf->parent);free(uf);return baseStr;
}

復雜度

  • 時間復雜度:O((n+m)logC)。其中n是s1和s2的長度,m是baseStr的長度,C是字符集大小,本題中為 26。由于并查集使用了路徑壓縮優化,合并和查找的平均時間復雜度為 O(α( C )),其中 α 是反阿克曼函數,最差時間復雜度為 O(logC)。

  • 空間復雜度:O( C ),C 是字符集大小,本題中為 26,并查集所需的空間是 O( C )。

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

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

相關文章

Ubuntu2404 下搭建 Zephyr 開發環境

1. 系統要求 操作系統&#xff1a;Ubuntu2404&#xff08;64位&#xff09;磁盤空間&#xff1a;至少 8GB 可用空間&#xff08;Zephyr 及其工具鏈較大&#xff09; 2. 安裝必要工具 Tool Min. Version CMake 3.20.5 Python 3.10 Devicetree compiler 1.4.6 2.1 安裝系…

2025年06月07日Github流行趨勢

項目名稱&#xff1a;netbird 項目地址url&#xff1a;https://github.com/netbirdio/netbird項目語言&#xff1a;Go歷史star數&#xff1a;14824今日star數&#xff1a;320項目維護者&#xff1a;mlsmaycon, braginini, pascal-fischer, lixmal, pappz項目簡介&#xff1a;使…

fast-reid部署

配置設置&#xff1a; 官方庫鏈接&#xff1a; https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安裝依賴&#xff1a; pip install -r docs/requirements.txt 編譯&#xff1a;切換到fastreid/evaluation/rank_cylib目錄下&a…

clickhouse 和 influxdb 選型

以下是 ClickHouse、InfluxDB 和 HBase 在體系架構、存儲引擎、數據類型、性能及場景的詳細對比分析: ??? ?一、體系架構對比? ?維度??ClickHouse??InfluxDB??HBase??設計目標?大規模OLAP分析,高吞吐復雜查詢 時序數據采集與監控,優化時間線管理高吞吐隨機…

ros創建工作空間配置運行狀態機

ROS 一、創建工作空間目錄 /home/wict/workspace/hudahua/ros/catkin_ws #初始化工作空間&#xff08;僅需一次&#xff09; catkin_init_workspace二&#xff1a;回到根目錄編譯 #創建正確的工作空間結構&#xff08;如果尚未創建&#xff09; mkdir -p ~/workspace/hudahua…

【看到哪里寫到哪里】C的“數組指針”

C里面&#xff0c;數組指針&#xff0c;不是基本類型。顧名思義&#xff0c;數組指針&#xff0c;是指針&#xff0c;是指向數組的指針&#xff1b; 1.它的基本定義樣子是 type (*ptr)[size]; 這個指針&#xff0c;指向的數組的&#xff1b;這里要注意&#xff0c;要定義數組…

深度相機的日常學習

文章目錄 一、深度相機的概念二、深度相機的工作原理三、深度相機的應用領域 一、深度相機的概念 深度相機&#xff08;Depth Camera&#xff09;是一種能夠捕捉場景中物體距離信息的設備&#xff0c;與傳統的 RGB 相機不同&#xff0c;深度相機不僅可以獲取場景的二維圖像信息…

elasticsearch基本操作筆記

1.通過kibana查看elasticsearch版本信息 a.左上角三道橫->Management->Dev Tools b.GET / 執行 c.執行結果 { “name” : “xxxx”, “cluster_name” : “xxxxxxx”, “cluster_uuid” : “vl1UudAoQp-aHWAzyPoMyw”, “version” : { “number” : “7.15.1”, “build…

兩種Https正向代理的實現原理

正向代理 HTTPS 主要有兩種方案&#xff0c;分別是基于證書的解密與再加密方案和基于 HTTP CONNECT 隧道的方案&#xff0c;以下是這兩種方案的具體信息&#xff1a; 一、基于證書的解密與再加密方案 原理 工作原理&#xff1a;代理服務器擁有自己的證書&#xff0c;客戶端需…

服務器健康摩爾斯電碼:深度解讀S0-S5狀態指示燈

當服務器機柜中閃爍起神秘的琥珀色燈光&#xff0c;運維人員的神經瞬間繃緊——這些看似簡單的Sx指示燈&#xff0c;實則是服務器用硬件語言發出的求救信號。掌握這套"摩爾斯電碼"&#xff0c;等于擁有了預判故障的透視眼。 一、狀態指示燈&#xff1a;服務器的生命體…

Java高級 | 【實驗七】Springboot 過濾器和攔截器

隸屬文章&#xff1a;Java高級 | &#xff08;二十二&#xff09;Java常用類庫-CSDN博客 系列文章&#xff1a;Java高級 | 【實驗一】Springboot安裝及測試 |最新-CSDN博客 Java高級 | 【實驗二】Springboot 控制器類相關注解知識-CSDN博客 Java高級 | 【實驗三】Springboot 靜…

【圖片識別改名】如何批量將圖片按圖片上文字重命名?自動批量識別圖片文字并命名,基于圖片文字內容改名,WPF和京東ocr識別的解決方案

應用場景 在日常工作和生活中&#xff0c;我們經常會遇到需要對大量圖片進行重命名的情況。例如&#xff0c;設計師可能需要根據圖片內容為設計素材命名&#xff0c;文檔管理人員可能需要根據掃描文檔中的文字對圖片進行分類命名。傳統的手動重命名方式效率低下且容易出錯&…

防火墻iptables項目實戰

目錄 一、網絡規劃 三、環境準備與檢測 1、firewall &#xff08;1&#xff09;配置防火墻各大網卡ip并禁用firewalld和selinux &#xff08;2&#xff09;打開firewall路由轉發 2、PC1&#xff08;內網&#xff09; &#xff08;1&#xff09;配置ip并禁用firewalld和s…

阿里云域名怎么綁定

阿里云服務器綁定域名全攻略&#xff1a;一步步輕松實現網站“零”障礙上線&#xff01; 域名&#xff0c;您網站在云端的“身份證”&#xff01; 在數字化浪潮中&#xff0c;擁有一個屬于自己的網站或應用&#xff0c;是個人展示、企業運營不可或缺的一環。而云服務器&#x…

從仿射矩陣得到旋轉量平移量縮放量

仿射變換原理 仿射變換是一種線性變換,可以包括平移、旋轉、縮放和剪切等操作。其一般公式可以表示為: $$\mathbf{x’} = A \mathbf{x} + \mathbf{b} ] 其中: (\mathbf{x}) 是輸入向量,通常表示一個點在二維或三維空間中的坐標。(\mathbf{x’}) 是輸出向量,表示經過仿射變…

C++課設:通訊錄管理系統(vector、map協作實現)

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 專欄介紹:《編程項目實戰》 目錄 一、為什么選擇C++開發通訊錄系統?1. C++的現狀2. STL標準模板庫的威力二、系統架構設計與STL容器選型1. 三層架構…

Spring Boot 常用注解面試題深度解析

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 Spring Boot 常用注解面試題深度解析一、核心…

黃曉明新劇《潛淵》定檔 失憶三面間諜開啟諜戰新維度

據悉&#xff0c;黃曉明領銜主演的諜戰劇《潛淵》已于近日正式定檔6月9日&#xff0c;該劇以“失憶三面間諜”梁朔為核心&#xff0c;打破傳統諜戰劇的框架和固有角度&#xff0c;以一種特別的視角將懸疑感推向極致。劇中&#xff0c;梁朔因頭部受傷失去記憶&#xff0c;陷入身…

【自動駕駛避障開發】如何讓障礙物在 RViz 中‘顯形’?呈現感知數據轉 Polygon 全流程

【自動駕駛避障開發】如何讓障礙物在 RViz 中"顯形"?呈現感知數據轉 Polygon 全流程 自動駕駛系統中的障礙物可視化是開發調試過程中至關重要的一環。本文將詳細介紹如何將自動駕駛感知模塊檢測到的障礙物數據轉換為RViz可顯示的Polygon(多邊形)形式,實現障礙物…

#16 學習日志軟件測試

#16 #13布置的任務都沒有wanc 反思一下 一個是貪玩 一個是懶 還有一個原因是學習方式 單看視頻容易困 然后是一個進度寶貝 java ai 編程 完 挑著看的 廖雪峰教程 完 速看 很多過時 javaweb ai筆記 見到13.aop 小林coding 看到4.并發 java guide 還沒開始 若依框架 筆…