力扣LeetCode: 2506 統計相似字符串對的數目

題目:

給你一個下標從?0?開始的字符串數組?words?。

如果兩個字符串由相同的字符組成,則認為這兩個字符串?相似?。

  • 例如,"abca"?和?"cba"?相似,因為它們都由字符?'a''b''c'?組成。
  • 然而,"abacba"?和?"bcfd"?不相似,因為它們不是相同字符組成的。

請你找出滿足字符串?words[i]??words[j]?相似的下標對?(i, j)?,并返回下標對的數目,其中?0 <= i < j <= words.length - 1?。

示例 1:

輸入:words = ["aba","aabb","abcd","bac","aabc"]
輸出:2
解釋:共有 2 對滿足條件:
- i = 0 且 j = 1 :words[0] 和 words[1] 只由字符 'a' 和 'b' 組成。 
- i = 3 且 j = 4 :words[3] 和 words[4] 只由字符 'a'、'b' 和 'c' 。 

示例 2:

輸入:words = ["aabb","ab","ba"]
輸出:3
解釋:共有 3 對滿足條件:
- i = 0 且 j = 1 :words[0] 和 words[1] 只由字符 'a' 和 'b' 組成。 
- i = 0 且 j = 2 :words[0] 和 words[2] 只由字符 'a' 和 'b' 組成。 
- i = 1 且 j = 2 :words[1] 和 words[2] 只由字符 'a' 和 'b' 組成。 

示例 3:

輸入:words = ["nba","cba","dba"]
輸出:0
解釋:不存在滿足條件的下標對,返回 0 。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i]?僅由小寫英文字母組成

解法:

解決思路

  1. 提取字符集合

    • 對于每個字符串,提取其中包含的字符種類(去重)。

    • 例如,"aba"?的字符集合是?{'a', 'b'}"aabb"?的字符集合也是?{'a', 'b'}

  2. 比較字符集合

    • 如果兩個字符串的字符集合相同,則它們相似。

    • 例如,"aba"?和?"aabb"?的字符集合都是?{'a', 'b'},因此它們相似。

  3. 統計相似對數

    • 對于所有字符串,統計具有相同字符集合的字符串數量。

    • 如果有?k?個字符串具有相同的字符集合,則這些字符串之間可以形成?C(k, 2)?對相似對(即從?k?個字符串中選 2 個的組合數)。


實現步驟

  1. 提取字符集合

    • 對每個字符串,將其字符去重并排序,生成一個唯一的標識符(例如,將字符集合轉換為字符串)。

    • 例如,"aba"?的字符集合是?{'a', 'b'},可以轉換為字符串?"ab"

  2. 統計字符集合的出現次數

    • 使用哈希表(unordered_map)記錄每個字符集合的出現次數。

    • 例如,"ab"?出現 2 次,"abc"?出現 1 次。

  3. 計算相似對數

    • 對于哈希表中的每個字符集合,如果有?k?個字符串具有相同的字符集合,則這些字符串之間可以形成?k * (k - 1) / 2?對相似對。

    • 將所有字符集合的相似對數累加,得到最終結果。


代碼實現

class Solution {
public:int similarPairs(vector<string>& words) {unordered_map<string, int> countMap;// 遍歷每個字符串,提取字符集合并統計for (const string& word : words) {string charSet = getCharSet(word);countMap[charSet]++;}int result = 0;// 計算滿足條件的下標對數量for (const auto& pair : countMap) {int k = pair.second;if (k >= 2) {result += k * (k - 1) / 2;}}return result;}private:string getCharSet(const string& word) {vector<char> chars(word.begin(), word.end());sort(chars.begin(), chars.end());chars.erase(unique(chars.begin(), chars.end()), chars.end());return string(chars.begin(), chars.end());}
};

代碼詳細解釋

  1. getCharSet?函數

    • 輸入:一個字符串?word

    • 輸出:該字符串的字符集合(去重并排序后的字符串)。

    • 實現步驟:

      • 將字符串轉換為字符數組?chars

      • 對字符數組排序(sort)。

      • 去重(unique?和?erase)。

      • 將字符數組轉換為字符串并返回。

    示例

    • 輸入:"aba"

    • 輸出:"ab"

  2. similarPairs?函數

    • 輸入:字符串數組?words

    • 輸出:滿足條件的下標對數量。

    • 實現步驟:

      • 遍歷每個字符串,調用?getCharSet?獲取字符集合。

      • 使用哈希表?countMap?統計每個字符集合的出現次數。

      • 遍歷哈希表,計算每個字符集合的相似對數,并累加到結果中。

    示例

    • 輸入:["aba", "aabb", "abcd", "bac", "aabc"]

    • 哈希表內容:{"ab": 2, "abcd": 1, "abc": 2}

    • 計算結果:C(2, 2) + C(2, 2) = 1 + 1 = 2


復雜度分析

  1. 時間復雜度

    • 提取字符集合:對于每個字符串,排序和去重的復雜度為?O(m log m),其中?m?是字符串的平均長度。

    • 統計哈希表:遍歷所有字符串的復雜度為?O(n),其中?n?是字符串的數量。

    • 計算相似對數:遍歷哈希表的復雜度為?O(n)

    • 總時間復雜度:O(n * m log m)

  2. 空間復雜度

    • 哈希表?countMap?的空間復雜度為?O(n)

    • 字符集合的空間復雜度為?O(m)

    • 總空間復雜度:O(n * m)


示例運行

示例 1:

輸入:words = ["aba", "aabb", "abcd", "bac", "aabc"]

  1. 提取字符集合:

    • "aba"?->?"ab"

    • "aabb"?->?"ab"

    • "abcd"?->?"abcd"

    • "bac"?->?"abc"

    • "aabc"?->?"abc"

  2. 統計哈希表:

    • {"ab": 2, "abcd": 1, "abc": 2}

  3. 計算相似對數:

    • "ab"?出現 2 次 ->?C(2, 2) = 1

    • "abc"?出現 2 次 ->?C(2, 2) = 1

    • 總相似對數:1 + 1 = 2

輸出:2


示例 2:

輸入:words = ["aabb", "ab", "ba"]

  1. 提取字符集合:

    • "aabb"?->?"ab"

    • "ab"?->?"ab"

    • "ba"?->?"ab"

  2. 統計哈希表:

    • {"ab": 3}

  3. 計算相似對數:

    • "ab"?出現 3 次 ->?C(3, 2) = 3

    • 總相似對數:3

輸出:3


示例 3:

輸入:words = ["nba", "cba", "dba"]

  1. 提取字符集合:

    • "nba"?->?"abn"

    • "cba"?->?"abc"

    • "dba"?->?"abd"

  2. 統計哈希表:

    • {"abn": 1, "abc": 1, "abd": 1}

  3. 計算相似對數:

    • 每個字符集合只出現 1 次,無法形成相似對。

    • 總相似對數:0

輸出:0


總結

通過提取字符集合、統計哈希表,并計算組合數,我們可以高效地解決這個問題。代碼的時間復雜度和空間復雜度都在合理范圍內,能夠處理題目中的最大輸入規模。

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

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

相關文章

關于Java 反射的簡單易懂的介紹

目錄 #0.總覽 #1. 類的反射 ①介紹 ②獲取 ③作用 獲取構造函數&#xff1a; 創建實例&#xff1a; 字段操作&#xff1a; 方法操作&#xff1a; 獲取修飾符&#xff1a; #2.總結 #0.總覽 反射&#xff0c;官方是這樣介紹它的&#xff1a; Reflection is a …

【精調】LLaMA-Factory 快速開始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下載 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…

【07】區塊鏈性能

7-1 基礎性能優化 7-1-1 區塊鏈性能瓶頸 總述 區塊鏈性能指標 區塊鏈的性能指標主要包括&#xff1a; 吞吐量&#xff1a;在固定時間內處理的交易數量 延時&#xff1a;對交易的響應和處理時間 主流區塊鏈與中心化平臺TPS對比 區塊鏈與傳統計算的對比 區塊鏈可信且中立…

安全面試2

文章目錄 簡單描述一下什么是水平越權&#xff0c;什么是垂直越權&#xff0c;我要發現這兩類漏洞&#xff0c;那我代碼審計要注意什么地方水平越權&#xff1a;垂直越權&#xff1a;水平越權漏洞的審計重點垂直越權漏洞的審計重點 解釋一下ssrf漏洞原理攻擊場景修復方法 橫向移…

【Linux 專欄】echo命令實驗

風123456789&#xff5e;-CSDN博客 最近文章閱讀排行榜 【爬蟲基礎】第一部分 網絡通訊 P1/3-CSDN博客 【爬蟲基礎】第一部分 網絡通訊-Socket套接字 P2/3-CSDN博客 【Linux專欄】find命令同步 實驗-CSDN博客 【Linux運維】非root用戶的單向免密登錄_linux 單向免密-CSDN博客…

RTSP協議全解析

RTSP&#xff08;Real Time Streaming Protocol&#xff09;協議全解析 一、協議概述 定位&#xff1a;應用層協議&#xff0c;用于控制流媒體服務器&#xff08;播放、暫停、錄制&#xff09;&#xff0c;媒體傳輸由 RTP/RTCP 實現。 特點&#xff1a; 基于文本&#xff08;…

第15屆 藍橋杯 C++編程青少組中/高級選拔賽 202401 真題答案及解析

第 1 題 【 單選題 】 表達式117 % 16 的結果是( )。 A:0 B:5 C:7 D:10 解析: % 是取模運算符,用于計算兩個數相除后的余數。 計算 117 / 16,結果是 7,余數是 5。因此,117 % 16 = 5。答案: B 第 2 題 【 單選題 】 下列選項中,字符數組定義正確的是( …

qt5實現表盤的旋轉效果,通過提升QLabel類

因為工作需要&#xff0c;需要實現溫度的表盤展示效果 實現思路&#xff1a; 通過提示聲QLabel控價類&#xff0c;實現報盤的旋轉和展示效果 1. 編寫一個QLabel的類MyQLabel,實現兩個方法 1. void paintEvent(QPaintEvent *event); //重繪函數 2. void valueChanged(int va…

通信系統中物理層與網絡層聯系與區別

在通信系統中&#xff0c;物理層和網絡層是OSI&#xff08;開放系統互連&#xff09;模型中的兩個重要層次&#xff0c;分別位于協議棧的最底層和第三層。它們在功能、職責和實現方式上有顯著的區別&#xff0c;但同時也在某些方面存在聯系。以下是物理層與網絡層的聯系與區別的…

【深度學習】Pytorch的深入理解和研究

一、Pytorch核心理解 PyTorch 是一個靈活且強大的深度學習框架&#xff0c;廣泛應用于研究和工業領域。要深入理解和研究 PyTorch&#xff0c;需要從其核心概念、底層機制以及高級功能入手。以下是對 PyTorch 的深入理解與研究的詳細說明。 1. 概念 動態計算圖&#xff08;D…

23種設計模式 - 解釋器模式

模式定義 解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為型設計模式&#xff0c;用于為特定語言&#xff08;如數控系統的G代碼&#xff09;定義文法規則&#xff0c;并構建解釋器來解析和執行該語言的語句。它通過將語法規則分解為多個類&#xff0c;實現…

使用 Openpyxl 操作 Excel 文件詳解

文章目錄 安裝安裝Python3安裝 openpyxl 基礎操作1. 引入2. 創建工作簿和工作表3. 寫入數據4. 保存工作簿5. 加載已存在的Excel6. 讀取單元格的值7. 選擇工作表 樣式和格式化1. 引入2. 設置字體3. 設置邊框4. 填充5. 設置數字格式6. 數據驗證7. 公式操作 性能優化1. read_only/…

nigix面試常見問題(2025)

一、Nginx基礎概念 1. 什么是Nginx? Nginx是一款高性能的HTTP/反向代理服務器及IMAP/POP3/SMTP代理服務器,由俄羅斯工程師Igor Sysoev開發。其核心優勢在于事件驅動架構與異步非阻塞處理模型,能夠高效處理高并發請求(如C10K問題),廣泛應用于負載均衡、靜態資源服務、AP…

002 SpringCloudAlibaba整合 - Feign遠程調用、Loadbalancer負載均衡

前文地址&#xff1a; 001 SpringCloudAlibaba整合 - Nacos注冊配置中心、Sentinel流控、Zipkin鏈路追蹤、Admin監控 文章目錄 8.Feign遠程調用、loadbalancer負載均衡整合1.OpenFeign整合1.引入依賴2.啟動類添加EnableFeignClients注解3.yml配置4.日志配置5.遠程調用測試6.服務…

代碼審計入門學習之sql注入

路由規則 入口文件&#xff1a;index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互聯網站內容管理系統 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …

React實現自定義圖表(線狀+柱狀)

要使用 React 繪制一個結合線狀圖和柱狀圖的圖表&#xff0c;你可以使用 react-chartjs-2 庫&#xff0c;它是基于 Chart.js 的 React 封裝。以下是一個示例代碼&#xff0c;展示如何實現這個需求&#xff1a; 1. 安裝依賴 首先&#xff0c;你需要安裝 react-chartjs-2 和 ch…

線程與進程的深入解析及 Linux 線程編程

在操作系統中&#xff0c;進程和線程是進行并發執行的兩種基本單位。理解它們的區別和各自的特點&#xff0c;能夠幫助開發者更好地進行多任務編程&#xff0c;提高程序的并發性能。本文將探討進程和線程的基礎概念&#xff0c;及其在 Linux 系統中的實現方式&#xff0c;并介紹…

全面指南:使用JMeter進行性能壓測與性能優化(中間件壓測、數據庫壓測、分布式集群壓測、調優)

目錄 一、性能測試的指標 1、并發量 2、響應時間 3、錯誤率 4、吞吐量 5、資源使用率 二、壓測全流程 三、其他注意點 1、并發和吞吐量的關系 2、并發和線程的關系 四、調優及分布式集群壓測&#xff08;待仔細學習&#xff09; 1.線程數量超過單機承載能力時的解決…

springboot整合mybatis-plus【詳細版】

目錄 一&#xff0c;簡介 1. 什么是mybatis-plus2.mybatis-plus特點 二&#xff0c;搭建基本環境 1. 導入基本依賴&#xff1a;2. 編寫配置文件3. 創建實體類4. 編寫controller層5. 編寫service接口6. 編寫service層7. 編寫mapper層 三&#xff0c;基本知識介紹 1. 基本注解 T…

HTTP 常見狀態碼技術解析(應用層)

引言 HTTP 狀態碼是服務器對客戶端請求的標準化響應標識&#xff0c;屬于應用層協議的核心機制。其采用三位數字編碼&#xff0c;首位數字定義狀態類別&#xff0c;后兩位細化具體場景。 狀態碼不僅是服務端行為的聲明&#xff0c;更是客戶端處理響應的關鍵依據。本文將從協議規…