代碼學習總結(一)

代碼學習總結(一)

這個系列的博客是記錄下自己學習代碼的歷程,有來自平臺上的,有來自筆試題回憶的,主要基于 C++ 語言,包括題目內容,代碼實現,思路,并會注明題目難度,保證代碼運行結果

1 最長公共前綴

簡單 字典樹 匹配

編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 “”。

示例輸入輸出 1:
輸入:strs = [“flower”,“flow”,“flight”]
輸出:“fl”

示例輸入輸出 2:
輸入:strs = [“dog”,“racecar”,“car”]
輸出:“”
解釋:輸入不存在公共前綴。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,則僅由小寫英文字母組成

思路解析:

  1. 把第一個字符串作為基準,然后把它和第二個進行匹配,把二者的公共前綴取出來
  2. 把基準替換為公共前綴,分別和其他的字符串進行比較,再把新的公共替換為基準
  3. 返回最終的基準
開始
strs是否為空?
返回空字符串
設置prefix為strs_0
初始化i = 1
i < strs.size?
返回prefix
初始化j = 0
j < prefix.size 且 j < strs_i.size 且 prefix_j == strs_i_j?
j加1
截斷prefix: prefix = prefix.substr_0_j
prefix是否為空?
i加1

本地 debug 代碼

#include <iostream>
#include <vector>
#include <string>using namespace std;string longestCommonPrefix(vector<string>& strs) {if (strs.empty()) return "";// 取第一個字符串作為基準string prefix = strs[0];// 從第二個字符串開始比較for (int i = 1; i < strs.size(); ++i) {int j = 0;// 比較當前前綴和 strs[i] 的公共部分while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {++j;}// 截斷前綴prefix = prefix.substr(0, j);// 如果公共前綴為空,直接返回if (prefix.empty()) return "";}return prefix;
}// 測試用例
int main() {vector<string> strs1 = {"flower", "flow", "flight"};vector<string> strs2 = {"dog", "racecar", "car"};cout << "示例 1 輸出: " << longestCommonPrefix(strs1) << endl; // 輸出: "fl"cout << "示例 2 輸出: " << longestCommonPrefix(strs2) << endl; // 輸出: ""return 0;
}

上述代碼的運行結果為

project cover 代碼運行結果1

可用于提交的代碼

string longestCommonPrefix(vector<string>& strs) {if (strs.empty()) return "";// 取第一個字符串作為基準string prefix = strs[0];// 從第二個字符串開始比較for (int i = 1; i < strs.size(); ++i) {int j = 0;// 比較當前前綴和 strs[i] 的公共部分while (j < prefix.size() && j < strs[i].size() && prefix[j] == strs[i][j]) {++j;}// 截斷前綴prefix = prefix.substr(0, j);// 如果公共前綴為空,直接返回if (prefix.empty()) return "";}return prefix;
}

2 單詞拆分 II

中等 字典樹 單詞拆分

給定一個字符串 s s s 和一個字符串字典 wordDict ,在字符串 s s s 中增加空格來構建一個句子,使得句子中所有的單詞都在詞典中。以任意順序 返回所有這些可能的句子。

注意:詞典中的同一個單詞可能在分段中被重復使用多次。

示例輸入輸出 1:
輸入: s = “catsanddog”, wordDict = [“cat”,“cats”,“and”,“sand”,“dog”]
輸出: [“cats and dog”,“cat sand dog”]

示例 2:

輸入: s = “pineapplepenapple”, wordDict = [“apple”,“pen”,“applepen”,“pine”,“pineapple”]
輸出: [“pine apple pen apple”,“pineapple pen apple”,“pine applepen apple”]
解釋: 注意你可以重復使用字典中的單詞。

示例 3:
輸入: s = “catsandog”, wordDict = [“cats”,“dog”,“sand”,“and”,“cat”]
輸出 :[]

思路解析:

  1. 由于需要尋找同一個字符串在某個給定字典下所有可能的單詞組合,所以最好是使用遞歸解決
  2. 而為了方便搜索,可以將給定字典轉化為無序字典,并使用一個單獨的字典用來存儲已經搜索出的結果
  3. 這里的遞歸對象因為是一個字符串,所以可以從左開始搜索,拿到第一個成型的單詞后,將右側的部分作為新的對象,進行遞歸,然后把左側的單詞壓入結果字典中
開始
初始化字典和記憶化搜索
調用 dfs 函數
memo 中是否存在 s?
返回 memo_s
初始化結果集 result
字典中是否存在 s?
將 s 加入 result
初始化 i = 1
i < s.size?
將 result 存入 memo_s
截取 left 和 right
字典中是否存在 left?
i 加 1
遞歸處理 right 部分
遍歷 rightPart 結果
將 left + '' + sub 加入 result
返回 result
打印結果
結束

本地 debug 代碼

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <unordered_map>using namespace std;class Solution {
public:vector<string> wordBreak(string s, vector<string>& wordDict) {unordered_set<string> dict(wordDict.begin(), wordDict.end()); // 初始化無序集合unordered_map<string, vector<string>> memo; // 初始化記憶化搜索return dfs(s, dict, memo);}private:vector<string> dfs(const string& s, unordered_set<string>& dict,unordered_map<string, vector<string>>& memo) {// 因為memo 是空的,所以如果 s 存在于這個空的變量中,它也是空的if (memo.count(s)) return memo[s];// 如果整個輸入都存在于字典中,那直接返回vector<string> result;if (dict.count(s)) {result.push_back(s);}// 針對字符串本身進行搜索for (int i = 1; i < s.size(); ++i) {string left = s.substr(0, i); // 往左搜索,字符的左側部分string right = s.substr(i); // 往右搜索,字符的右側部分if (dict.count(left)) { //如果左側部分存在于字典中vector<string> rightPart = dfs(right, dict, memo); // 遞歸對右側部分進行處理for (const string& sub : rightPart) {result.push_back(left + " " + sub); // 將左側部分和右側部分都壓入到結果中}}}memo[s] = result;return result;}
};void printResults(const std::vector<std::string>& results) {std::cout << "[";for (size_t i = 0; i < results.size(); ++i) {std::cout << "\"" << results[i] << "\"";if (i != results.size() - 1) {std::cout << ",";}}std::cout << "]" << std::endl;
}// 測試用例
int main() {Solution sol;string s1 = "catsanddog";vector<string> wordDict1 = {"cat","cats","and","sand","dog"};string s2 = "pineapplepenapple";vector<string> wordDict2 = {"apple","pen","applepen","pine","pineapple"};string s3 = "catsandog";vector<string> wordDict3 = {"cats","dog","sand","and","cat"};vector<string> results1 = sol.wordBreak(s1, wordDict1);printResults(results1); // 輸出: ["cats and dog","cat sand dog"]vector<string> results2 = sol.wordBreak(s2, wordDict2);printResults(results2); // 輸出: ["pine apple pen apple","pineapple pen apple","pine applepen apple"]vector<string> results3 = sol.wordBreak(s3, wordDict3);printResults(results3); // 輸出: []return 0;
}

上述代碼的運行結果為

project cover 代碼運行結果2

可用于提交的代碼

class Solution {
public:vector<string> wordBreak(string s, vector<string>& wordDict) {unordered_set<string> dict(wordDict.begin(), wordDict.end()); // 初始化無序集合unordered_map<string, vector<string>> memo; // 初始化記憶化搜索return dfs(s, dict, memo);}private:vector<string> dfs(const string& s, unordered_set<string>& dict,unordered_map<string, vector<string>>& memo) {// 因為memo 是空的,所以如果 s 存在于這個空的變量中,它也是空的if (memo.count(s)) return memo[s];// 如果整個輸入都存在于字典中,那直接返回vector<string> result;if (dict.count(s)) {result.push_back(s);}// 針對字符串本身進行搜索for (int i = 1; i < s.size(); ++i) {string left = s.substr(0, i); // 往左搜索,字符的左側部分string right = s.substr(i); // 往右搜索,字符的右側部分if (dict.count(left)) { //如果左側部分存在于字典中vector<string> rightPart = dfs(right, dict, memo); // 遞歸對右側部分進行處理for (const string& sub : rightPart) {result.push_back(left + " " + sub); // 將左側部分和右側部分都壓入到結果中}}}memo[s] = result;return result;}
};void printResults(const std::vector<std::string>& results) {std::cout << "[";for (size_t i = 0; i < results.size(); ++i) {std::cout << "\"" << results[i] << "\"";if (i != results.size() - 1) {std::cout << ",";}}std::cout << "]" << std::endl;
}

這里的題目是 leetcode 中的,感興趣的同學們可以去提交下試試,可以直接運行通過,每日二題,努力加油😉!!!

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

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

相關文章

OSPF的接口網絡類型【復習篇】

OSPF在不同網絡環境下默認的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的網絡類型網絡類型OSPF接口的網絡類型&#xff08;工作方式&#xff09;計時器BMA&#xff08;以太網&#xff09;broadcast &#xff0c;需要DR/BDR的選舉hello&#xff1a;10s…

PHM學習軟件|PHM預測性維護系統

使用步驟教程如下 1、登錄 用戶名&#xff1a;52phm 密碼&#xff1a;xxx &#xff08;區別在于不同用戶密鑰不一樣&#xff09; 2、上傳需要分析的數據集 支持數據集格式&#xff1a;csv、xlsx、xls、mat、json 3、主題1&#xff1a;機械參數計算 計算軸承、齒輪、皮帶的…

MySQL MVCC 機制詳解

MySQL MVCC 機制詳解 1. MVCC 基本概念 MVCC 是一種并發控制的方法&#xff0c;主要用于數據庫管理系統&#xff0c;允許多個事務同時讀取數據庫中的同一個數據項&#xff0c;而不需要加鎖&#xff0c;從而提高了數據庫的并發性能。 ┌──────────────────…

Model Context Protocol (MCP) - 嘗試創建和測試一下MCP Server

1.簡單介紹 MCP是Model Context Protocol的縮寫&#xff0c;是Anthropic開源的一個標準協議。MCP使得大語言模型可以和外部的數據源&#xff0c;工具進行集成。當前MCP在社區逐漸地流行起來了。同時official C# SDK(倉庫是csharp-sdk) 也在不斷更新中&#xff0c;目前最新版本…

(三)行為模式:12、訪問者模式(Visitor Pattern)(C++示例)

目錄 1、訪問者模式含義 2、訪問者模式的UML圖學習 3、訪問者模式的應用場景 4、訪問者模式的優缺點 5、訪問者模式C實現的實例 1、訪問者模式含義 訪問者模式&#xff08;Visitor Pattern&#xff09;是一種行為型設計模式&#xff0c;它允許將一個作用于某對象結構中的各…

windows安卓子系統wsa隱藏應用列表的安裝激活使用

Windows 11 安卓子系統應用部署全攻略 windows安卓子系統wsa隱藏應用列表的安裝激活使用|過檢測核心前端 在 Windows 11 系統中&#xff0c;安卓子系統為用戶帶來了在電腦上運行安卓應用的便利。經過一系列的操作&#xff0c;我們已經完成了 Windows 11 安卓子系統的底層和前端…

Elasticsearch 集群搭建

一、集群規劃 1.1 節點角色規劃 節點類型配置要求推薦數量Master節點低磁盤、中等CPU/內存3&#xff08;奇數防止腦裂&#xff09;Data節點高磁盤、高內存、多核CPU根據數據量擴展Coordinating節點高CPU/內存、低磁盤2&#xff08;可選&#xff09; 1.2 硬件建議 內存&…

React 響應事件

開發環境&#xff1a;Reacttsantd 使用 React 可以在 JSX 中添加 事件處理函數。其中事件處理函數為自定義函數&#xff0c;它將在響應交互&#xff08;如點擊、懸停、表單輸入框獲得焦點等&#xff09;時觸發。 學習內容 1.編寫事件處理函數的不同方法 2.如何從父組件傳遞事件…

SQL基礎入門:從CRUD到JOIN再到索引(通俗易懂版)

一、為什么需要SQL&#xff1f; 想象你在管理一個圖書館&#xff1a; 傳統方法&#xff1a;手動記錄每本書的位置、借閱者、歸還日期SQL方法&#xff1a;用數據庫系統自動管理&#xff0c;快速查詢《Java編程思想》在哪個書架 SQL&#xff08;Structured Query Language&…

MINIQMT學習課程Day11

現在開始進行策略的交易買賣分析&#xff1a; 還是之前的步驟&#xff0c;打開qmt&#xff0c;選擇獨立交易&#xff0c; 之后使用pycharm&#xff0c;編寫py文件 導入包&#xff1a; import time, datetime, traceback, sys from xtquant import xtdata from xtquant.xttr…

# 實時人臉性別與年齡識別:基于OpenCV與深度學習模型的實現

實時人臉性別與年齡識別&#xff1a;基于OpenCV與深度學習模型的實現 在當今數字化時代&#xff0c;計算機視覺技術正以前所未有的速度改變著我們的生活與工作方式。其中&#xff0c;人臉檢測與分析作為計算機視覺領域的重要分支&#xff0c;已廣泛應用于安防監控、智能交互、…

Python Cookbook-5.14 給字典類型增加排名功能

任務 你需要用字典存儲一些鍵和“分數”的映射關系。你經常需要以自然順序(即以分數的升序)訪問鍵和分數值&#xff0c;并能夠根據那個順序檢查一個鍵的排名。對這個問題&#xff0c;用dict 似乎不太合適。 解決方案 我們可以使用 dict 的子類&#xff0c;根據需要增加或者重…

十四種邏輯器件綜合對比——《器件手冊--邏輯器件》

目錄 邏輯器件 簡述 按功能分類 按工藝分類 按電平分類 特殊功能邏輯器件 應用領域 詳盡闡述 1 邏輯門 一、基本概念 二、主要類型 三、實現方式 四、應用領域 2 反相器 工作原理 基本功能 主要應用 常見類型 特點 未來發展趨勢 3 鎖存器 基本概念 工作原理 主要類型…

如何更改wsl2中的ubuntu默認安裝位置

先前的一篇文章提到了如何更改wsl里面ubuntu的home目錄&#xff0c;wsl裝ubuntu的home目錄在哪&#xff0c;如何更改home&#xff1f;_wsl安裝的ubuntu在哪里-CSDN博客 這次是要更改wsl中ubuntu的安裝目錄&#xff0c;畢竟默認安裝到c盤下會占用不少空間的。 從微軟商店get后…

最近在工作中感受到了設計模式的重要性

之前了解設計模式&#xff1a;只是應付一下面試 在之前一年多的工作中也沒遇到使用場景 最近在搭建驗證環境的時候&#xff0c;才發現這玩意這么重要 首先是設計模式的使用場景一定是在很復雜繁瑣的場景下進行的 之所以說是復雜/繁瑣的場景&#xff0c;因為一些場景也許邏輯不難…

Python深度學習基礎——卷積神經網絡(CNN)(PyTorch)

CNN原理 從DNN到CNN 卷積層與匯聚 深度神經網絡DNN中&#xff0c;相鄰層的所有神經元之間都有連接&#xff0c;這叫全連接&#xff1b;卷積神經網絡 CNN 中&#xff0c;新增了卷積層&#xff08;Convolution&#xff09;與匯聚&#xff08;Pooling&#xff09;。DNN 的全連接…

Linux 第三講 --- 基礎指令(三)

前言&#xff1a; 在前面我們已經講了有十幾個Linux的基礎指令&#xff0c;今天我們再補充幾個常用的基礎指令&#xff0c;為后面的學習做準備 。 目錄 前言&#xff1a; 一、兩個與時間相關的指令 1.date指令 演示 &#xff1a; 時間戳 設置時間 2、cal指令 演示&#x…

基于SiamFC的紅外目標跟蹤

基于SiamFC的紅外目標跟蹤 1,背景與原理2,SiamFC跟蹤方法概述2.1 核心思想2.2 算法優勢3,基于SiamFC的紅外跟蹤代碼詳解3.1 網絡定義與交叉相關模塊3.2 SiamFC 跟蹤器實現3.3 主程序:利用 OpenCV 實現視頻跟蹤4,總結與展望在紅外監控、無人機防御以及低光照場景中,紅外圖…

Odoo 部署本地 把現時的excel計算表格部署上odoo 教程

要將現有的 Excel 計算表格部署到 Odoo 平臺上&#xff0c;您可以按照以下步驟進行操作&#xff1a; 將 Excel 表格中的數據轉移到 Odoo 模塊中&#xff1a;首先&#xff0c;您需要將 Excel 表格中的數據導出為 CSV 格式&#xff0c;然后可以使用 Odoo 的數據導入功能將這些數據…

KWDB創作者計劃—KWDB認知引擎:數據流動架構與時空感知計算的范式突破

引言&#xff1a;數據智能的第三范式 在數字化轉型進入深水區的2025年&#xff0c;企業數據系統正面臨三重悖論&#xff1a;數據規模指數級增長與實時決策需求之間的矛盾、多模態數據孤島與業務連續性要求之間的沖突、靜態存儲范式與動態場景適配之間的鴻溝。KWDB&#xff08;K…