力扣DAY60-61 | 熱100 | 回溯:單詞搜索、分割回文串

前言

中等 √ 繼續回溯,不知咋地感覺這兩題有點難度,是因為隔一天就手感生疏了嗎?

單詞搜索

我的題解

定義方向數組、二維訪問數組。圖搜索,向上下左右每個方向搜索,需要更新的信息:坐標、是否遍歷過、搜索到的字母位置。剪枝條件:數組越界、超出單詞長度、已搜到、位置已訪問過。注意:起始位置不能從0,0開始,需要先遍歷整個圖找出單詞首字母位置,存入隊列,再遍歷該隊列進行搜索。

class Solution {
public:int m, n, l;bool ans = false;vector<vector<int>> dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};vector<vector<bool>> visited;void findans(vector<vector<char>>& board, string word, int c, int r, int point){//數組越界、超出單詞長度、不符合if (c < 0 || c >= m || r < 0 || r >= n || point >= l || ans == true || visited[c][r] == true)return;for (int i = 0; i < 4; i++){if (board[c][r] == word[point]){if (point == l-1) ans = true;int dc = dir[i][0];int dr = dir[i][1];visited[c][r] = true;findans(board, word, c + dc, r + dr, point + 1);visited[c][r] = false;}}}bool exist(vector<vector<char>>& board, string word) {m = board.size();n = board[0].size();l = word.size();queue<pair<int, int>> q;for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (board[i][j] == word[0])q.push({i, j});}}while (!q.empty() && ans == false){visited.resize(m, vector<bool>(n, false));findans(board, word, q.front().first, q.front().second, 0);q.pop();}return ans;}
};

官方題解

官解思路與筆者一致,不贅述,這里貼一個評論區的優化方法

第一個優化

比如示例 3,word=ABCB,其中字母?B?出現了?2?次,但?board?中只有?1?個字母?B,所以肯定搜不到?word,直接返回?false。

一般地,如果?word?的某個字母的出現次數,比?board?中的這個字母的出現次數還要多,可以直接返回?false。

第二個優化

設?word?的第一個字母在?board?中的出現了?x?次,word?的最后一個字母在?board?中的出現了?y?次。

如果?y<x,我們可以把?word?反轉,相當于從?word?的最后一個字母開始搜索,這樣更多的時候一開始就匹配失敗,遞歸的總次數更少。

加上這兩個優化,就可以擊敗接近?100%?了!

心得

本質是圖搜索,知識點都是關聯的,比較多邊界條件要考慮,另外筆者的剪枝位置與官解不太一致,一個是函數開頭,一個是循環里面下一層遞歸前,應該都是一樣的,不過感覺可以的話盡量在下一層遞歸前剪枝好一點,這應該也是預剪枝和后剪枝的區別?節省時間和空間。

分割回文串

我的題解

遍歷從上一刀(初始為0)到末尾的每個位置,如果為回文,加入子解集中,一直到上一刀到末尾為止,加入總解集中。雙指針判斷是否回文。

class Solution {
public:vector<vector<string>> ans;vector<string> pre;bool isPaindrome(string s, int begin, int end){while (begin < end){if (s[begin] == s[end]){begin ++;end --;}else{return false;}}return true;}void findans(string s, int point){if (point == s.size()){ans.push_back(pre);}for (int i = point; i < s.size(); i++){if (isPaindrome(s, point, i)){pre.push_back(s.substr(point, i+1-point));findans(s, i+1);pre.pop_back();}}}vector<vector<string>> partition(string s) {if (s.empty())return {};findans(s, 0);return ans;}
};

官方題解

官解與筆者思路大致一樣,但是用了動態規劃把每個子串是不是回文串預處理了出來,大大節省時間。

class Solution {
private:vector<vector<int>> f;vector<vector<string>> ret;vector<string> ans;int n;public:void dfs(const string& s, int i) {if (i == n) {ret.push_back(ans);return;}for (int j = i; j < n; ++j) {if (f[i][j]) {ans.push_back(s.substr(i, j - i + 1));dfs(s, j + 1);ans.pop_back();}}}vector<vector<string>> partition(string s) {n = s.size();f.assign(n, vector<int>(n, true));for (int i = n - 1; i >= 0; --i) {for (int j = i + 1; j < n; ++j) {f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];}}dfs(s, 0);return ret;}
};

心得

果然一天不做就手生了,官解的動態規劃解法認真學習,有點意思!

知識點

初始化二維數組 f.assign(n, vector<int>(n, true));?

  1. vector<int>(n, true)??:

    • 創建一個大小為?n?的?vector<int>(整數向量)
    • 所有元素初始化為?true(注意:true?會被隱式轉換為?int?類型的?1
  2. ??f.assign(n, ...)??:

    • 對向量?f?進行賦值操作
    • 將?f?設置為包含?n?個上述創建的?vector<int>(n, true)
    • 結果是創建一個?n × n?的二維向量,所有元素初始化為?1

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

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

相關文章

超簡單的git學習教程

本博客僅用于記錄學習和使用 前提聲明全部內容全部來自下面廖雪峰網站&#xff0c;如果侵權聯系我刪除 0.前言 相信有不少人被推薦那個游戲學習git&#xff0c;一個不止我一個完全沒學習過的進去后一臉懵&#xff0c;半天都通不過一關然后就放棄了&#xff0c;我個人覺得那個…

【每日八股】復習 MySQL Day1:事務

文章目錄 復習 MySQL Day1&#xff1a;事務MySQL 事務的四大特性&#xff1f;并發事務會出現什么問題&#xff1f;MySQL 事務的隔離級別&#xff1f;不同事務隔離級別下會發生什么問題&#xff1f;MVCC 的實現原理&#xff1f;核心數據結構版本鏈構建示例可見性判斷算法MVCC 可…

在極狐GitLab 身份驗證中如何使用 OIDC?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 使用 OpenID Connect 作為認證提供者 (BASIC SELF) 您可以使用極狐GitLab 作為客戶端應用程序&#xff0c;與 OpenID Connec…

PHP騰訊云人臉核身生成 SDK 接口調用步驟使用簽名

參考騰訊云官方文檔&#xff1a; 人臉核身 生成 SDK 接口調用步驟使用簽名_騰訊云 前提條件&#xff1a;成功獲取NonceTicket。 獲取參考文檔&#xff1a; PHP騰訊云人臉核身獲取NONCE ticket-CSDN博客 function getTxFaceSign(){$appId ;$userId ;$version 1.0.0;$tic…

每日一題算法——鏈表相交

鏈表相交 力扣題目鏈接 暴力解法:飄過 class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode * cur headA;while(cur ! NULL){ListNode* curb headB;while(curb ! NULL){if(curbcur){return cur;}curb curb->next;}cu…

詳解Windows(一)——系統盤下目錄及文件詳解

引言 你是否曾經好奇過電腦里那些神秘的文件夾都是干什么用的&#xff1f;為什么有些文件是.exe而有些是.dll&#xff1f;不同的圖片格式.jpg和.png到底有什么區別&#xff1f;如果你對這些問題感到困惑&#xff0c;這篇文章就是為你準備的。今天&#xff0c;我們將以通俗易懂…

大模型賦能工業制造革新:10個顯效可落地的應用場景

在工業4.0的洶涌浪潮中&#xff0c;制造業正面臨著前所未有的轉型挑戰。傳統制造模式在效率、成本、質量等方面逐漸難以滿足市場需求&#xff0c;企業急需借助新技術實現數字化轉型&#xff0c;以提升自身競爭力。在此背景下&#xff0c;基于先進的數據分析技術、大模型、知識圖…

AI語音助手 React 組件使用js-audio-recorder實現,將獲取到的語音轉成base64發送給后端,后端接口返回文本內容

頁面效果&#xff1a; js代碼&#xff1a; import React, { useState, useRef, useEffect } from react; import { Layout, List, Input, Button, Avatar, Space, Typography, message } from antd; import { SendOutlined, UserOutlined, RobotOutlined, AudioOutlined, Stop…

pycharm無法識別到本地python的conda環境解決方法

問題一 現象描述&#xff1a; 本地已經安裝了conda&#xff0c;但在pycharm中選擇conda環境卻識別不到&#xff0c; 解決方法&#xff1a;手動輸入conda path&#xff0c;點擊R eload environments基本就能修復&#xff0c;比如我的路徑如下 /Users/test/conda/miniconda3/b…

PDK中technology file從tf格式轉換為lef格式

在數字后端流程中需要導入technology file工藝文件&#xff0c;一般傳統的PDK中都提供.tf形式&#xff0c;能夠在Synopsys ICC中進行導入。但是由于Cadence Innovus不斷地完善&#xff0c;更多的工程采用了其進行數字后端設計。不過Cadence Innovus導入的是.lef格式的工藝文件&…

UE虛幻4虛幻5動畫藍圖調試,觸發FellOutOfWorld事件和打印輸出,繼續DeepSeek輸出

找到了一個pdf&#xff0c;本來想寫個翻譯的&#xff0c;但還是算了&#xff0c;大概看了下&#xff0c;這類文檔很全面&#xff0c;內容很多&#xff0c;但都不是我要的&#xff0c;我想要一個動畫藍圖&#xff0c;搜索Montage&#xff0c;或者Anim 只占了一行&#xff08;幾百…

【Sa-Token】學習筆記05 - 踢人下線源碼解析

目錄 前言 強制注銷 踢人下線 源碼解析 前言 所謂踢人下線&#xff0c;核心操作就是找到指定 loginId 對應的 Token&#xff0c;并設置其失效。 上圖為踢人下線后&#xff0c;前端應該用圖像給出來讓用戶重新登錄&#xff0c;而不是讓前端收到一個描述著被下線 的JSON 強…

C語言==》字符串斷行

示例代碼 #include <stdio.h>int main(void) {printf("Heres one way to print a ");printf("long string.\n");printf("Heres another way to print a \ long string.\n");printf("Heres the newest way to print a ""lo…

Linux | I.MX6ULL 文件系統

01 本節所有的測試程序需要開發板有 Qt 環境來運行。我們提供的文件系統是由 yocto 裁剪整理得來的。之后我們會整理一份單獨移植的 qt 系統。方便用戶移植第三方軟件。如果用戶的文件系統非我們的出廠版本,請參考之前燒寫章節重新燒寫出廠文件系統。開發板啟動需要輸入登錄…

網絡原理 - 應用層, 傳輸層(UDP 和 TCP) 進階, 網絡層, 數據鏈路層 [Java EE]

目錄 應用層 1. 應用層的作用 2. 自定義應用層協議 3. 應用層的 "通用協議格式" 3.1 xml 3.2 json 3.3 protobuffer (pd) 傳輸層 1. UDP 1.1 無連接 1.2 不可靠傳輸 1.3 面向數據報 1.4 全雙工 1.5 緩沖區 1.6 UDP 數據報 2. TCP 2.1 有連接 …

如何將自己封裝的組件發布到npm上:詳細教程

如何將自己封裝的組件發布到npm上&#xff1a;詳細教程 作為前端開發者&#xff0c;我們經常從npm&#xff08;Node Package Manager&#xff09;上下載并使用各種第三方庫和組件。然而&#xff0c;有時候我們可能會發現自己需要的功能在npm上并不存在&#xff0c;或者我們希望…

[OS_7] 訪問操作系統對象 | offset | FHS | Handle

實驗代碼可以看去年暑假的這篇文章&#xff1a;【Linux】進程間通信&#xff1a;詳解 VSCode使用 | 匿名管道 我們已經知道&#xff0c;進程從 execve 后的初始狀態開始&#xff0c;可以通過 mmap 改變自己的地址空間&#xff0c;通過 fork 創建新的進程&#xff0c;再通過 exe…

關于TCP三次握手和四次揮手過程中的狀態機、使用三次握手和四次揮手的原因、擁塞控制

關于傳輸層中的TCP協議&#xff0c;我們在之前的博客中對其報文格式、三次握手、四次揮手、流量控制、數據傳輸等機制進行了具體說明&#xff0c;接下來在前面所學的基礎上&#xff0c;我們再來講講TCP中三次握手和四次揮手各階段所處的狀態機以及為什么要使用三次握手和四次揮…

學習筆記二十——Rust trait

&#x1f9e9; Rust Trait 徹底搞懂版 &#x1f440; 目標讀者&#xff1a;對 Rust 完全陌生&#xff0c;但想真正明白 “Trait、Trait Bound、孤島法則” 在做什么、怎么用、為什么這樣設計。 &#x1f6e0; 方法&#xff1a; 先給“心里模型”——用生活類比把抽象概念掰開揉…

es 混合檢索多向量

在結合向量相似度檢索的同時,可以通過 bool 查詢的 filter 或 must 子句實現關鍵詞過濾。以下是一個同時包含 關鍵詞匹配 和 多向量相似度計算 的完整示例: 參考博文:ES集群多向量字段檢索及混合檢索方法-CSDN博客 示例:帶關鍵詞過濾的多向量聯合檢索 GET /my_index/_sea…