【算法】 【c++】字符串s1 中刪除所有 s2 中出現的字符

【算法】 【c++】字符串s1 中刪除所有 s2 中出現的字符

eg:
s1:“helloworld”
s2:“wd”
刪除后:s1:“helloorl”

1 雙循環匹配并刪除–>時間復雜度O(n^2)

string 里面的刪除函數–>erase

std::string::erase` 是 C++ 標準庫中用于刪除字符串中字符或子串的方法。


1. erase(pos, len)
  • 作用:從字符串的 索引 pos 位置開始,刪除 len 個字符。
  • 參數
    • pos:起始索引(從 0 開始)。
    • len:要刪除的字符數量(默認值 std::string::npos,即刪除到末尾)。
  • 返回值:修改后的 string 自身(左移剩余字符)。

示例

#include <iostream>
#include <string>using namespace std;int main() {string s = "abcdef";s.erase(2, 2);  // 從索引 2 ('c') 開始刪除 2 個字符,變成 "abef"cout << s << endl;  // 輸出: "abef"return 0;
}

2. erase(iterator pos)
  • 作用:刪除 pos 迭代器指向的字符。
  • 參數
    • pos:指向要刪除字符的 迭代器
  • 返回值:指向刪除字符后 下一個字符的迭代器

示例

#include <iostream>
#include <string>using namespace std;int main() {string s = "abcdef";auto it = s.begin() + 2;  // 指向 'c's.erase(it);  // 刪除 'c',變成 "abdef"cout << s << endl;  // 輸出: "abdef"return 0;
}

3. erase(iterator first, iterator last)
  • 作用:刪除 [first, last) 范圍內的字符(包括 first,不包括 last)。
  • 參數
    • first:起始迭代器。
    • last:結束迭代器(不刪除)。
  • 返回值:指向刪除區域后第一個剩余字符的迭代器。

示例

#include <iostream>
#include <string>using namespace std;int main() {string s = "abcdef";s.erase(s.begin() + 1, s.begin() + 4);  // 刪除索引 1~3 ('b' 到 'd'),變成 "aef"cout << s << endl;  // 輸出: "aef"return 0;
}

4. erase-remove慣用法(高效刪除多個字符)

在 C++ 里,erase 不能直接刪除多個 指定字符,但可以配合 std::remove_if 實現 高效批量刪除

示例

#include <iostream>
#include <string>
#include <algorithm>using namespace std;int main() {string s = "abcdebc";// 刪除所有 'b's.erase(remove(s.begin(), s.end(), 'b'), s.end());cout << s << endl;  // 輸出: "acdec"return 0;
}

原理

  1. remove 把所有 非 ‘b’ 的字符 重新排列到前面,返回新末尾的迭代器。
  2. erase 刪除新末尾之后的所有字符,完成去重。

總結

用法作用適用場景
erase(pos, len)pos 開始刪除 len 個字符刪除固定范圍的子串
erase(iterator pos)刪除 pos 迭代器指向的字符通過迭代器刪除單個字符
erase(iterator first, iterator last)刪除 [first, last) 范圍字符通過迭代器刪除一段子串
erase(remove_if(...))批量刪除多個指定字符需要高效刪除多個字符

#include<iostream>
using namespace std;
#include<string>
#include<vector>
void dele(string& s1, string& s2)
{int n2 = s2.size();if (n2 < 1)return;for (int i = 0;i < s1.size();i++){for (int j = 0;j < n2;j++){if (s1[i] == s2[j]){s1.erase(i,1);i--;}}}}
int main()
{string s1, s2;cin >> s1 >> s2;dele(s1, s2);cout << s1 << endl;
}

2unordered_set存儲s2

unordered_set使用

是 C++ STL 提供的 無序集合,底層使用 哈希表 實現,支持 O(1) 平均時間復雜度 進行 插入、刪除、查找

1. 基本用法

(1) 頭文件

#include <unordered_set>

(2) 聲明

unordered_set<int> mySet;  // 存儲 int 類型
unordered_set<string> mySet2;  // 存儲 string 類型

(3) 插入

mySet.insert(10);
mySet.insert(20);

(4) 遍歷

for (int num : mySet) {  cout << num << " ";  
}

?? 注意: unordered_set 無序存儲,遍歷順序 不確定


2. 主要操作

(1) 插入元素

unordered_set<int> mySet;
mySet.insert(1);
mySet.insert(2);

(2) 查找元素

if (mySet.find(2) != mySet.end()) {  cout << "2 存在" << endl;  
} else {  cout << "2 不存在" << endl;  
}

find(x) != end() 表示 找到 x,否則 未找到

(3) 刪除元素

mySet.erase(2);  // 刪除值為 2 的元素

(4) 統計個數

cout << mySet.size() << endl;

(5) 清空集合

mySet.clear();

3. 高級用法

(1) 使用 count(x) 判斷是否存在

if (mySet.count(2)) {cout << "2 存在" << endl;
} else {cout << "2 不存在" << endl;
}

count(x) 返回 0(不存在)或 1(存在)。

(2) 迭代器遍歷

for (auto it = mySet.begin(); it != mySet.end(); ++it) {cout << *it << " ";
}

4. 時間復雜度

操作平均時間復雜度
insert(x)O(1)
find(x)O(1)
erase(x)O(1)
遍歷O(n)

5. 適用場景
? 快速去重unordered_set 可以存儲唯一值,O(1) 查找是否存在
? 快速查找:比 vectorset 更快的 O(1) 查找
? 集合操作:常用于 字符刪除、重復元素去除 等。


  • 使用 unordered_set 來加速字符匹配,使得刪除操作的時間復雜度從優化到 O(n)。
  • set的查詢速度為O(1)
  • 使用writeIndex保存s1要寫入的位置
  • 在存儲s2的set里面查詢,是否存在對應字符,不存在的寫入s1前面
  • 刪掉后續字符
#include <iostream>
#include <string>
#include <unordered_set>using namespace std;void dele(string& s1, const string& s2) {unordered_set<char> removeSet(s2.begin(), s2.end()); // Step 1: 用哈希表存儲 s2 中所有字符int writeIndex = 0; // Step 2: 記錄寫入位置for (int i = 0; i < s1.size(); i++) { // Step 3: 遍歷 s1if (!removeSet.count(s1[i])) { // Step 4: 如果 s1[i] 不在 s2 中s1[writeIndex++] = s1[i]; // Step 5: 把 s1[i] 寫入當前位置}}s1.erase(writeIndex); // Step 6: 刪除剩余部分
}int main() {string s1, s2;cin >> s1 >> s2;dele(s1, s2);  // 調用刪除函數cout << s1 << endl;  // 輸出修改后的 s1return 0;
}

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

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

相關文章

利用委托用戶控件、窗體之間傳值 c#

獲取數據方&#xff08;usercontrol111&#xff09;聲明 public Func<Tuple<int, int>> GetCurrentResult { get; set; }獲取數據方調用 var val GetCurrentResult?.Invoke() ?? new Tuple<decimal, decimal>(0, 0);數據發送方聲明與賦值 usercontrol111…

【3-14 STC-pair超級詳細的解說】

1. pair的定義和結構 ? 基礎概念&#xff1a;考察對std::pair模板類的理解&#xff0c;包括其頭文件&#xff08;<utility>&#xff09;和基本語法&#xff08;pair<T1, T2>&#xff09;。 ? 成員訪問&#xff1a;測試對first和second成員變量的使用能力。 ? 構…

機器人觸覺的意義

機器人觸覺的重要性 觸覺在機器人領域至關重要&#xff0c;尤其是在自主操作、精細操控、人機交互等方面。雖然視覺和語音技術已高度發展&#xff0c;但機器人在現實世界中的操作仍然受限&#xff0c;因為&#xff1a; 視覺有局限性&#xff1a;僅憑視覺&#xff0c;機器人難…

RabbitMQ消息持久化與Lazy模式對比分析

RabbitMQ消息持久化與Lazy模式對比分析 在RabbitMQ中&#xff0c;消息持久化與Lazy模式是兩種不同的機制&#xff0c;分別針對消息可靠性、存儲優化等不同維度設計。以下從六個層面進行深度對比&#xff1a; 一、核心目標與作用對象差異 維度消息持久化&#xff08;delivery_…

Search-R1 、 R1-Searcher 和 Search-O1

原文鏈接:https://i68.ltd/notes/posts/20250307-search-r1/ Search-R1 DeepSeek團隊開發的SEARCH-R1模型通過強化學習&#xff0c;讓AI學會了自主搜索信息并將其與推理過程無縫結合&#xff0c;性能提升高達26%高效、可擴展的RL訓練框架&#xff0c;用于推理和搜索引擎調用&…

linux 命令 tail

tail 是 Linux 中用于查看文件末尾內容的命令&#xff0c;常用于日志監控和大文件快速瀏覽。以下是其核心用法及常見選項&#xff1a; 基本語法 tail [選項] 文件名 常用選項 顯示末尾行數 -n <行數> 或 --lines<行數> 指定顯示文件的最后若干行&#xff08;…

某乎x-zse-96加密算法分析與還原

文章目錄 1. 寫在前面2. 接口分析3. 加密分析4. 算法實現 【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致…

Java常用算法

一、排序算法 排序算法是計算機科學中最基礎的算法之一&#xff0c;用于將一組數據按照特定順序排列。 1.1 冒泡排序&#xff08;Bubble Sort&#xff09; 通過重復遍歷列表&#xff0c;比較相鄰元素并交換位置&#xff0c;直到列表有序。時間復雜度&#xff1a;O(n)。 pub…

ubuntu 24 安裝 python3.x 教程

目錄 注意事項 一、安裝不同 Python 版本 1. 安裝依賴 2. 下載 Python 源碼 3. 解壓并編譯安裝 二、管理多個 Python 版本 1. 查看已安裝的 Python 版本 2. 配置環境變量 3. 使用 update-alternatives? 管理 Python 版本 三、使用虛擬環境為項目指定特定 Python 版本…

【后端】【django】Django 自帶的用戶系統與 RBAC 機制

Django 自帶的用戶系統與 RBAC 機制 Django 自帶的用戶系統&#xff08;django.contrib.auth&#xff09;提供了 身份驗證&#xff08;Authentication&#xff09; 和 權限管理&#xff08;Authorization&#xff09;&#xff0c;能夠快速實現 用戶管理、權限控制、管理員后臺…

怎樣使用Modbus轉Profinet網關連接USB轉485模擬從站配置案例

怎樣使用Modbus轉Profinet網關連接USB轉485模擬從站配置案例 Modbus轉profinet網關可以將Modbus協議轉化為profinet協議&#xff0c;以實現設備之間的數據交互。在實際使用過程中&#xff0c;我們需要使用Modbus協議進行設備通訊&#xff0c;而profinet協議則是用于工業自動化…

5.編譯鏈接和宏**

1. 宏&#xff08;考察很多&#xff09;-要求輕松實現宏&#xff0c;很容易出錯 #define 機制包括了一個規定&#xff0c;允許把參數替換到文本中&#xff0c;這種實現通常稱為宏或定義宏。 下面是宏的聲明方式&#xff1a; #define name(參數列表) 內容 參數列表的左括號必…

如何搭建一個適配微信小程序,h5,app的uni-app項目

在vscode搭建 uni-app 項目&#xff08;Vue 3 Vite Pinia uView Plus&#xff09; 一、環境準備 1. 安裝 Node.js 確保已安裝 Node.js&#xff08;需≥14版本&#xff09;&#xff0c;可通過以下命令檢查版本&#xff1a; node -v2. 安裝 VSCode 從 VSCode 官網 下載并…

Kotlin apply 方法的用法和使用場景

Kotlin apply 方法的用法和使用場景 1. 方法簡介 apply 是 Kotlin 標準庫中的一個擴展函數&#xff0c;用于對對象執行一系列操作&#xff0c;并返回該對象本身。它的語法如下&#xff1a; inline fun <T> T.apply(block: T.() -> Unit): T參數&#xff1a;block 是…

一文解讀python高階功能:匿名函數到魔法方法(__call__)

文章目錄 一、python中匿名方法的使用使用示例注意事項總結 二、匿名函數和魔法方法的結合示例&#xff1a;結合 lambda 和 __call__解釋更復雜的示例 總結 一、python中匿名方法的使用 在 Python 中&#xff0c;匿名方法是通過 lambda 關鍵字定義的&#xff0c;通常稱為 lamb…

云服務器新手配置內網穿透服務(frp)

首先你得有一個公網服務器&#xff0c;有了它你就可以借助它&#xff0c;將自己電腦進行配置內網穿透&#xff0c;讓自己內網電腦也可以異地輕松訪問。網上教程較多&#xff0c;特此記錄我自己的配置&#xff0c;避免迷路&#xff0c;我這里只記錄我自己云服務小白&#xff0c;…

基于STM32的火災報警設備(阿里云平臺)

目錄 前言&#xff1a; 一、項目介紹和演示視頻 二、硬件需求準備 三、硬件框圖 1. 原理圖 2. PCB 四、CubeMX配置 五、代碼框架 前言&#xff1a; 源代碼下載鏈接&#xff1a; https://download.csdn.net/download/m0_74712453/90474701 需要實物的可以私信博主或者…

學習筆記之車票搜索為什么用Redis而不是ES?

在文章正式開始前&#xff0c;大家打開 12306.cn 搜索一趟列車&#xff0c;根據搜索條件判斷&#xff0c;數據搜索技術使用 ElasticSearch 或者其它搜索技術是否合適&#xff1f; 這里我先把答案說下&#xff0c;12306 車票搜索用的是 Redis &#xff0c;而不是大家常用的 Ela…

揭秘AI:機器學習與深度學習的奧秘

文章目錄 機器學習與深度學習1. 什么是人工智能&#xff1f;2. 機器學習、深度學習和人工智能又是什么關系&#xff1f;3. 人工智能解決了什么問題&#xff1f;為什么需要人工智能&#xff1f;4. 機器學習、深度學習常用術語1&#xff09;模型2&#xff09;數據集3&#xff09;…

【具體場景實踐】使用存儲過程查數據全流程+自動調度

文章目錄 場景設計場景描述:公司員工管理系統需求1. 創建數據庫和表2. 插入測試數據3. 復雜存儲過程4. 調用存儲過程5. 結果示例6. 細節優化存儲過程總結7. 自動定期執行存儲過程7.1 啟用 MySQL 事件調度器7.2 創建定時任務(每天凌晨 2 點自動執行)7.3 查看和管理事件1?? …