回溯難題(算法村第十八關黃金挑戰)

復原 IP 地址

93. 復原 IP 地址 - 力扣(LeetCode)

有效 IP 地址 正好由四個整數(每個整數位于 0255 之間組成,且不能含有前導 0),整數之間用 '.' 分隔。

  • 例如:"0.1.2.201" "192.168.1.1"有效 IP 地址,但是 "0.011.255.245""192.168.1.312""192.168@1.1"無效 IP 地址。

給定一個只包含數字的字符串 s ,用以表示一個 IP 地址,返回所有可能的有效 IP 地址,這些地址可以通過在 s 中插入 '.' 來形成。你 不能 重新排序或刪除 s 中的任何數字。你可以按 任何 順序返回答案。

示例 1:

輸入:s = "25525511135"
輸出:["255.255.11.135","255.255.111.35"]

示例 2:

輸入:s = "0000"
輸出:["0.0.0.0"]

示例 3:

輸入:s = "101023"
輸出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

提示:

  • 1 <= s.length <= 20
  • s 僅由數字組成

IP地址只有四段,所以將分割的段數 == 4作為終止條件。考慮到構造IP地址時還要手動給添加三個小數點,所以我們用變量pointCount來表示小數點數量,pointCount == 3說明字符串分成了4段了。

List<String> addressList = new ArrayList<>();public List<String> restoreIpAddresses(String s)
{if(s.length() < 4 || s.length() > 12)return addressList;backTracing(s, 0, 0);return addressList;
}//判斷索引在[start,end]之間的字符能否構造有效的IP的地址
public boolean isValid(String s, int start, int end)
{//避免數組越界if (start > s.length() - 1)return false;//含有前導零if (s.charAt(start) == '0' && start != end)return false;//四位數及以上if (end - start >= 3)return false;int num = 0;for (int i = start; i <= end; i++)num = num * 10 + s.charAt(i) - '0';return num <= 255;
}/*** @param pointCount  . 的個數*/
public void backTracing(String s, int startIndex, int pointCount)
{//若已經分成四段if (pointCount == 3){//若最后一段有效,則記錄一個有效IP地址if (isValid(s, startIndex, s.length() - 1))addressList.add(s);return;}//分段不足則繼續分for (int i = startIndex; i < s.length(); i++){if (isValid(s, startIndex, i)){//用截取、拼接的方法插入 .s = s.substring(0, i + 1) + "." + s.substring(i + 1);pointCount++;//插入 . 后,字符串 s 中下一個數字的索引為 i + 2。//不用擔心越界,因為 s 的長度也變大了backTracing(s, i + 2, pointCount);//撤回 .s = s.substring(0, i + 1) + s.substring(i + 2);pointCount--;}else //若中間有一段無效,那后面的都不用看了break;}
}

電話號碼的字母組合

17. 電話號碼的字母組合 - 力扣(LeetCode)

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。答案可以按 任意順序 返回。

給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

img

示例 1:

輸入:digits = "23"
輸出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

輸入:digits = ""
輸出:[]

示例 3:

輸入:digits = "2"
輸出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范圍 ['2', '9'] 的一個數字。

圖解思路

在這里插入圖片描述

代碼實現

List<String> combinationList = new ArrayList<>();
String digits;//數字到字母的映射
String[] map = {"", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//更高效的字符串拼接類型
StringBuilder combination = new StringBuilder();public List<String> letterCombinations(String digits)
{if(digits.isEmpty())return combinationList;this.digits = digits;backTracing(0);return combinationList;
}/*** @param numIndex digits中數字 num 的索引*/
public void  backTracing(int numIndex)
{if (numIndex > digits.length() - 1){combinationList.add(combination.toString());return;}//求 num 所映射的字符串String str = map[digits.charAt(numIndex) - '0'];for (int i = 0; i < str.length(); i++){//從 str 中依次選取單個字符combination.append(str.charAt(i));//從 digits 中選擇下一個數字backTracing(numIndex + 1);//撤銷組合中最后一個字符,循環再試(換本層 str 的下一個字符)combination.deleteCharAt(combination.length() - 1);}
}

括號生成

22. 括號生成 - 力扣(LeetCode)

數字 n 代表生成括號的對數,請你設計一個函數,用于能夠生成所有可能的并且 有效的 括號組合。

示例 1:

輸入:n = 3
輸出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

輸入:n = 1
輸出:["()"]

提示:

  • 1 <= n <= 8

深搜,做減法

public List<String> generateParenthesis(int n)
{//特判if (n == 0)return null;//結果集ArrayList<String> res = new ArrayList<>();//深搜,找出全部有效括號組合DFS(res, n, n, "");return res;
}/*** @param res 結果集* @param left 左括號還能用幾個* @param right 右括號還能用幾個* @param curStr 當前遞歸所得到的字符串*/
public static void DFS(List<String> res, int left, int right, String curStr)
{//左右括號都用完了;將一種組合添加到結果集if (left == 0 && right == 0){res.add(curStr);return;}//若左括號剩余數量大于右括號剩余數量,則“剪枝”(不再進行這種錯誤模式的括號組合)。if (left > right)return;//若還剩余左括號,則使用左括號if (left > 0)DFS(res, left - 1, right, curStr + "(" );//若還剩余右括號,則使用右括號if (right > 0)DFS(res, left, right - 1, curStr +")" );
}

深搜,做加法

public List<String> generateParenthesis_2(int n)
{//特判if (n == 0)return null;//結果集ArrayList<String> res = new ArrayList<String>();//深搜,尋找全部有效括號組合DFS_2(res, 0, 0, "", n);return res;
}/*** @param res 結果集* @param left 左括號使用了幾個* @param right 右括號使用使用了幾個* @param curStr 當前遞歸所得到的字符串* @param n 題目所給的括號生成對數*/
public static void DFS_2(List<String> res, int left, int right, String curStr, int n)
{//遞歸終止;將一種組合添加到結果集if (left == n && right == n){res.add(curStr);return;}//若左括號使用數量小于右括號使用數量,則“剪枝”(不再進行這種錯誤模式的括號組合)if (left < right)return;//若還剩余左括號,則使用左括號if (left < n)DFS_2(res, left + 1, right, curStr + "(", n);//若還剩余右括號,則使用右括號if (right < n)DFS_2(res, left, right + 1, curStr +")", n);
}

廣搜

class Node
{String curStr;int left;   //左括號還剩幾個沒用int right; //右括號還剩幾個沒用public Node(String curStr, int left, int right){this.curStr = curStr;this.left = left;this.right = right;}
}public List<String> generateParenthesis_3(int n)
{//特判,否則n==0時下面的算法會返回""if(n == 0)return null;//結果集ArrayList<String> res = new ArrayList<String>();ArrayDeque<Node> queue = new ArrayDeque<>();//初始結點入隊queue.offer(new Node("", n, n));while (!queue.isEmpty()){//隊頭元素出隊Node curNode = queue.poll();//生成了一組有效括號if(curNode.left == 0 && curNode.right == 0)res.add(curNode.curStr);//若還剩余左括號,則使用左括號if (curNode.left > 0)queue.offer(new Node(curNode.curStr + "(", curNode.left - 1, curNode.right));//若還剩余右括號,且左括號剩余數少于右括號剩余數,則使用右括號if (curNode.right > 0 && curNode.left < curNode.right)queue.offer(new Node(curNode.curStr + ")", curNode.left, curNode.right - 1));}return res;
}

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

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

相關文章

IDEA中使用git提交代碼時,有.class文件怎么避免

在IDEA中使用git提交代碼時&#xff0c;git把.class文件都給我放進來了&#xff0c;而我并不想要提交.class文件 我要提交的是.java文件 應該怎么設置呢 解決方案&#xff0c;點擊整個項目的生命周期中的clean之前&#xff0c;你會發現git提交欄的.class文件都不見了。

常用LDO型號

常用LDO型號 常用LDO型號-國產&進口 常用的LDO&#xff08;低壓差線性穩壓器&#xff09;型號有以下這些&#xff1a; LM2937及LM2937-N&#xff1a;這兩款是TI&#xff08;德州儀器&#xff09;的產品&#xff0c;其中LM2937-N為低噪聲版本&#xff0c;適用于對噪聲敏感…

vue是如何監聽對象和數組變化的

Vue框架通過其響應式系統來監聽對象和數組的變化。這個系統的核心在于追蹤依賴關系&#xff0c;并在數據變化時通知所有依賴于該數據的觀察者。 1. 對象監聽 Vue使用Object.defineProperty方法來劫持各個屬性的getter和setter。當組件中的數據被讀取時&#xff0c;會觸發gette…

ROS2服務通信的實現

文章目錄 1.服務通信的概念及應用場景1.1概念1.2 應用場景 2.準備工作3.服務通信的實現3.1 服務通信接口消息3.2 服務端實現3.3 客戶端實現3.4 編譯及運行3.4.1 修改CMakeLists3.4.2 服務端運行結果3.4.2 客戶端運行結果 1.服務通信的概念及應用場景 1.1概念 服務通信也是ROS…

抖店0元入駐不交錢會怎么樣?個人店和個體店的利弊分析,開店必看

我是王路飛。 現在的抖店是可以開通個人店的。 也就是不需要營業執照、直接使用個人身份證就可以在抖音開店&#xff0c;而且也不需要繳納店鋪保證金就能開店運營了。 但真實情況是怎么樣的呢&#xff1f;新手0元入駐抖店不交這個保證金會怎么樣呢&#xff1f; 今天給想在抖…

AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用

原文鏈接&#xff1a;AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用 一開啟大模型 1 開啟大模型 1)大模型的發展歷程與最新功能 2)大模型的強大功能與應用場景 3)國內外經典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diff…

ios App 發送廣播失敗解決

記錄開發 ios App 使用 c 混編時遇到的問題&#xff1a; 開發環境 macOS Sonoma&#xff08;最新版本14.3.1&#xff09; Xcode Version 15.2 ipadOS&#xff08;最新版本17.3.1&#xff09; 問題&#xff1a;在mac 上 和 ipad上測試&#xff0c;當 udp 發送廣播&#xff…

跨域引起的兩個接口的session_id不是同一個

來源場景&#xff1a; RequestMapping(“/captcha”)接口設置了SESSION_KEY&#xff0c;也能獲取到&#xff0c;但是到了PostMapping(“/login”)接口就是空的&#xff0c;由于跨域導致的兩個session_id不是同一個 /*** 系統用戶 前端控制器*/ Controller CrossOrigin(origins…

【數據結構和算法初階(C語言)】雙向循環帶頭鏈表的增刪查改詳解(天才設計的鏈表結構,應用簡單逆天!!!!!)

目錄 ?編輯?編輯 1.雙向鏈表的定義&#xff1a;前赴后繼 2.帶頭鏈表的定義-----哨兵位 3.增刪查改 3.1創建新節點函數----方便后續增加節點調用 3.2創建哨兵位----創建頭結點 3.3增加節點&#xff0c;尾部插入數據 3.4尾刪除 3.5查找函數----遍歷對比&#xff…

AcWing 562.壁畫

咱先看一眼算法標簽&#xff0c;發現是思維題、枚舉、前綴和 Buttt其實我們根據上訴的樣例解釋部分就會發現&#xff0c;其實這就是一個長度為?n/2?&#xff08;向上取整哦&#xff09;的連續子數組的最大和。 這題我也用暴力法試過啦&#xff0c;很明顯會TLE 如果你對dp題…

Mac M系列芯片如何重新安裝系統

使用可引導安裝器重新安裝&#xff08;可用于安裝非最新的 Mac OS&#xff0c;系統降級&#xff0c;需要清除所有數據&#xff0c;過程確保連接上網絡&#xff0c;雖然這種方式不會下載 Mac OS&#xff0c;但是需要下載固件等信息&#xff09; 插入制作好的可引導安裝器&#x…

【使用imgaug庫調整圖像大小并修改對應的XML標簽框】

使用imgaug庫可以方便地進行圖像增強操作&#xff0c;包括調整圖像大小。以下是使用imgaug庫調整圖像大小并修改對應的XML標簽框的示例腳本&#xff1a; 注意修改輸入文件夾路徑、輸出文件夾路徑和目標尺寸為自己內容。 input_folder "path/to/your/input_folder" …

kalibr標定ZED2i雙目加imu

一、錄制bag 本人使用的zed2i相機。 rosbag record -O 32 /zed2i/zed_node/imu/data /zed2i/zed_node/imdata_raw /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color /zed2i/zed_node/left_raw/image_raw_color /zed2i/zed_node/right_raw/ima…

Matlab|【免費】基于合作博弈的綜合能源系統利益分配優化調度

目錄 主要內容 部分代碼 結果一覽 下載鏈接 主要內容 該程序實現的模型為綜合能源系統利益分配優化調度&#xff0c;采用合作博弈方法&#xff0c;模型針對IES系統的P2G、電解槽、甲烷反應器、儲氫罐、CHP和燃氣鍋爐等設備進行建模&#xff0c;實現基于合作博弈的…

std::shared_from_this注意事項:exception bad_weak_ptr

1.不可以在構造函數中調用shared_from_this() 因為它的實現是&#xff1a; _LIBCPP_INLINE_VISIBILITYshared_ptr<_Tp> shared_from_this(){return shared_ptr<_Tp>(__weak_this_);}也就是它依賴的__weak_this_此時還未創建完成。 2.一定要public繼承 class MyTy…

大數據開發(Java面試真題-卷二)

大數據開發&#xff08;Java面試真題&#xff09; 1、請簡要說明Java中equeals()和hashCode()的作用及區別&#xff1f;2、Java中的四種訪問修飾符及它們之間的區別&#xff1f;3、請解釋Java中的異常處理機制&#xff0c;包括checked exception和unchecked exception?4、Java…

Linux 學習筆記(10)

十、 進程管理 進程就是運行中的程序&#xff0c;一個運行著的程序&#xff0c;可能有多個進程。 比如 LinuxSir.Org 所用的 WWW 服務器是 apache 服務器&#xff0c;當管理員啟動服務后&#xff0c;可能會有好多人來訪問&#xff0c;也就是說許多用戶來同時請 求 htt…

QT debug編譯失敗:xxx/bin/ld.exe: cannot find -lxxd1

原因&#xff1a;由于編譯時&#xff0c;使用debug模式下&#xff0c;動態庫沒有對應的lxxd1中的xx庫 解決方案1&#xff1a;改為release編譯&#xff1b; 解決方案2&#xff1a;在引用的三方pri文件中&#xff0c;去掉多余的d #修改前 if(!debug_and_release|build_pass):CON…

沃德的背包

題目描述 沃德進入源碼世界的路上有很多寶石&#xff0c;可是沃德的背包只能背總重量不超過m的寶石&#xff0c;路上一共有n個寶石&#xff0c;每個寶石的重量為wi&#xff0c;請你幫沃德選擇盡量多的寶石裝進背包&#xff0c;請注意寶石的總重量不超過m。 輸入描述 第一行輸…

Django官網項目 二

官網地址&#xff1a;Writing your first Django app, part 2 | Django documentation | Django 創建模組&#xff1a; 注冊model &#xff08;bug&#xff1a;沒有加后面的逗號&#xff09; 在manage.py 的目錄下&#xff1a; python manage.py makemigrations polls pyth…