LeetCode題練習與總結:復原IP地址--93

一、題目描述

有效 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 僅由數字組成

二、解題思路

這個問題是一個典型的回溯問題,我們可以使用遞歸的方式來解決。首先,我們需要明確幾個規則:

  1. IP 地址由四部分組成,每部分的范圍在 0 到 255 之間。
  2. 每部分可以是 1 到 3 位數字。
  3. 不能有前導 0,即 0 不能出現在除了單個 0 自身以外的其他數字的開頭。

基于以上規則,我們可以按照以下步驟來解決這個問題:

  1. 初始化一個列表?result?來保存所有可能的 IP 地址。
  2. 定義一個遞歸函數?restoreIpAddressesHelper,該函數接受當前構建的 IP 地址?currentIp,剩余未處理的字符串?remaining,以及當前已添加的段數?segment
  3. 在遞歸函數中,如果?segment?等于 4 且?remaining?為空,說明一個有效的 IP 地址構建完成,將其添加到?result?列表中。
  4. 遍歷?remaining?字符串,對于每個位置,嘗試提取 1 到 3 位數字作為 IP 地址的一部分,并遞歸調用?restoreIpAddressesHelper
  5. 在遞歸調用之前,檢查提取的數字是否在 0 到 255 的范圍內,且沒有前導 0(除了數字 0 本身)。
  6. 最后,返回?result?列表。

三、具體代碼

import java.util.ArrayList;
import java.util.List;public class Solution {public List<String> restoreIpAddresses(String s) {List<String> result = new ArrayList<>();restoreIpAddressesHelper(result, "", s, 0);return result;}private void restoreIpAddressesHelper(List<String> result, String currentIp, String remaining, int segment) {if (segment == 4 && remaining.isEmpty()) {result.add(currentIp);return;}for (int i = 1; i <= 3 && i <= remaining.length(); i++) {String part = remaining.substring(0, i);if ((part.startsWith("0") && part.length() > 1) || Integer.parseInt(part) > 255) {continue;}restoreIpAddressesHelper(result, currentIp.isEmpty() ? part : currentIp + "." + part, remaining.substring(i), segment + 1);}}public static void main(String[] args) {Solution solution = new Solution();List<String> ipAddresses = solution.restoreIpAddresses("25525511135");System.out.println(ipAddresses);}
}

四、時間復雜度和空間復雜度

1. 時間復雜度
  • 最壞情況分析:對于 IP 地址的每個部分,我們有三種選擇:取一位、取兩位或取三位數字。因此,對于四個部分,最壞情況下的時間復雜度是 O(3^4)。

  • 實際分析:然而,由于輸入字符串?s?的長度限制(1 <= s.length <= 20),我們通常不會探索所有可能的選擇。例如,如果剩余的字符串長度不足以構成四個有效的 IP 地址部分,我們會提前停止遞歸。這意味著實際的時間復雜度會低于 O(3^4)。

  • 遞歸調用次數:遞歸調用的次數取決于輸入字符串的長度和字符串中數字的分布。在最壞情況下,每次遞歸調用會有三次新的遞歸調用,但這通常會被輸入字符串的長度限制所減少。

  • 綜上所述,時間復雜度是 O(3^4),但通常會低于這個值。

2. 空間復雜度
  • 遞歸棧空間:遞歸棧的最大深度是 4,因為 IP 地址有四部分。因此,遞歸棧的空間復雜度是 O(4)。

  • 結果存儲空間:結果列表?result?的大小取決于輸入字符串?s?可以形成的有效 IP 地址的數量。在最壞情況下,這個數量是 O(3^4)。然而,實際上,由于輸入字符串的長度限制,生成的有效 IP 地址數量通常會遠小于這個上界。

  • 實際空間復雜度:由于實際的 IP 地址數量通常遠小于 O(3^4),實際的空間復雜度通常會低于這個值。

  • 綜上所述,空間復雜度是 O(3^4),但通常會低于這個值。

五、總結知識點

  1. 回溯算法:這是一種通過探索所有可能的候選解來找到所有解的算法。如果候選解被確認不是一個解(或者至少不是最后一個解),回溯算法會丟棄該解,即回溯并且嘗試另一個候選解。

  2. 遞歸:這是一種編程技巧,函數自己調用自己。在這個問題中,restoreIpAddressesHelper?函數遞歸地調用自己來探索所有可能的 IP 地址組合。

  3. 字符串操作:代碼中使用了字符串的?substring?方法來提取字符串的一部分,以及?isEmpty?和?startsWith?方法來檢查字符串是否為空或者是否以某個特定字符開頭。

  4. 整數轉換:使用了?Integer.parseInt?方法將字符串轉換為整數。這在檢查提取的字符串是否在 0 到 255 的范圍內時使用。

  5. 列表(List):使用了?ArrayList?來存儲找到的所有可能的 IP 地址。ArrayList?是 Java 中 List 接口的一個實現,它允許我們動態地添加、刪除和訪問元素。

  6. 條件語句:使用了?if?語句來檢查遞歸的基本情況(當生成了一個完整的 IP 地址時)以及提取的字符串部分是否有效。

  7. 循環:使用了?for?循環來遍歷所有可能的字符串部分長度(1 到 3)。

  8. 函數定義和調用:定義了?restoreIpAddresses?和?restoreIpAddressesHelper?兩個函數,并在?restoreIpAddresses?函數中調用了?restoreIpAddressesHelper

  9. 參數傳遞:在遞歸調用中,通過參數傳遞當前的 IP 地址部分、剩余的字符串和當前段數。

  10. 遞歸的基本情況:在?restoreIpAddressesHelper?函數中,當生成了一個完整的 IP 地址時(段數為 4 且沒有剩余的字符串),將其添加到結果列表中,這是遞歸的基本情況。

  11. 遞歸的遞推關系:在?restoreIpAddressesHelper?函數中,通過遞歸調用自己來處理下一個 IP 地址段,這是遞歸的遞推關系。

以上就是解決這個問題的詳細步驟,希望能夠為各位提供啟發和幫助。

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

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

相關文章

Rust學習筆記(中)

前言 筆記的內容主要參考與《Rust 程序設計語言》&#xff0c;一些也參考了《通過例子學 Rust》和《Rust語言圣經》。 Rust學習筆記分為上中下&#xff0c;其它兩個地址在Rust學習筆記&#xff08;上&#xff09;和Rust學習筆記&#xff08;下&#xff09;。 錯誤處理 pani…

01、什么是ip、協議、端口號知道嗎?計算機網絡通信的組成是什么?

聲明&#xff1a;本教程不收取任何費用&#xff0c;歡迎轉載&#xff0c;尊重作者勞動成果&#xff0c;不得用于商業用途&#xff0c;侵權必究&#xff01;&#xff01;&#xff01; 目錄 前言 計算機網絡 網絡ip地址 網絡協議 網絡端口號 前言 最近有個項目要用到相關文章…

Android — 使用 Runtime 獲取日志并保存至 download 目錄

萬一哪天要用找不到 使用 Runtime 獲取日志并保存至 download 目錄。 try {final String path Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() File.separator;ArrayList<String> commandLine new ArrayList&l…

藍橋杯單片機之模塊代碼《多樣點燈方式》

過往歷程 歷程1&#xff1a;秒表 歷程2&#xff1a;按鍵顯示時鐘 歷程3&#xff1a;列矩陣按鍵顯示時鐘 歷程4&#xff1a;行矩陣按鍵顯示時鐘 歷程5&#xff1a;新DS1302 歷程6&#xff1a;小數點精確后兩位ds18b20 歷程7&#xff1a;35定時器測量頻率 歷程8&#xff…

大數據Scala教程從入門到精通第六篇:Scala編譯結果反編譯分析

一&#xff1a;Scala編譯結果反編譯分析 問題&#xff1a;為什么Scalac之后的生成的class文件有兩個&#xff0c;一個帶$的&#xff0c;一個不帶$的&#xff1f; 不能直接java 執行scala編譯的字節碼文件。 直接運行的話就會報錯&#xff0c;會報一個類沒有被找到。 引入類庫就…

JavaScript 防抖與節流——以游戲智慧解鎖實戰奧秘

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 &#x1f3ae; 引言? 什么是防抖和節流&#x1f3f9; 防抖(Debounce) - 鎖定追擊&#xff0c;精確無誤&#x1f4cc; 基礎概念&#x1f4cc; 適用場景&#x1f4cc; 實戰代碼&#xff1a;防抖 應用于輸入框的實時搜索 &…

經濟學博弈論介紹

經濟學博弈論是經濟學的一個重要分支&#xff0c;研究經濟主體之間的策略選擇和互動。博弈論的核心理論框架是“博弈”&#xff0c;即在不確定對方行為的情況下&#xff0c;個體根據自身利益和目標制定策略。 在經濟學博弈論中&#xff0c;個體被稱為“博弈者”&#xff0c;他…

Java基礎入門day48

day48 JDBC調用關系 tomcat 簡介 tomcat是Apache下的一個核心項目&#xff0c;免費開源&#xff0c;支持servlet和jsp。 tomcat技術先進&#xff0c;性能穩定&#xff0c;目前比較流行的web應用服務器 安裝 官網&#xff1a; Apache Tomcat - Welcome! 下載 tomcat8.5 解壓&a…

Linux入門攻堅——23、DNS和BIND基礎入門1

DNS——Domain Name Service&#xff0c;協議&#xff08;C/S&#xff0c;53/udp&#xff0c;53/tcp&#xff09; BIND——Berkeley Internet Name Domain&#xff0c;ISC&#xff08;www.isc.org&#xff09; 互聯網絡上主機之間的通信依靠的是IP&#xff0c;而人或程序一般使…

tailwindcss大綱

布局 css說明地址aspect-ratio用于控制元素縱橫比Aspect Ratio - Tailwind CSSwidth <br />max-widthcontainer&#xff1a;用于將元素的寬度固定到當前斷點的組件Container - Tailwind CSScolumns用于控制元素內列數Columns - Tailwind CSSbreak-after用于控制列或頁在…

通義靈碼企業版正式發布,滿足企業私域知識檢索、數據合規、統一管理等需求

5 月 9 日阿里云 AI 峰會&#xff0c;阿里云智能集團首席技術官周靖人宣布&#xff0c;通義靈碼企業版正式發布&#xff0c;滿足企業用戶的定制化需求&#xff0c;幫助企業提升研發效率。 通義靈碼是國內用戶規模第一的智能編碼助手&#xff0c;基于 SOTA 水準的通義千問代碼模…

基于 element-ui 表格組件 el-table 導出表格數據

方法一&#xff1a;前端處理&#xff0c;直接導出 e-table 組件的表格數據 import XLSX from xlsx;/*** el-table 表格導出* param {*} idSelector id選擇器* param {*} name 導出表格名稱* param {*} remove 表格是否存在左/右固定列&#xff0c;存在則傳入true&#xff0c;反…

在MyBatis中,如何將數據庫中的字符串類型映射為枚舉類型?

在MyBatis中&#xff0c;如何將數據庫中的字符串類型映射為枚舉類型&#xff1f; 網上看了很多教程。說了很多&#xff0c;但是都沒說到重點&#xff01; 很簡單&#xff0c;xml文件中&#xff0c; 使用resultType&#xff0c;而不是使用resultMap就可以了。 resultType"…

用HAL庫改寫江科大的stm32入門例子8-1 DMA數據轉運

實驗1-實驗目的&#xff1a;通過DMA把buffer的數據搬運到buffer2當中。 //declare a buffer to store the data uint32_t buffer[3] {1,2,3};//declare a buffer to store the data uint32_t buffer2[3] {0,0,0}; DMA&#xff1a;是個搬運數據的小助手。 相關設置&#xff1…

Baidu Comate:釋放編碼潛能,革新軟件開發

Baidu Comate Baidu Comate&#xff0c;智能代碼助手&#xff0c;憑借著文心大模型的強大支撐&#xff0c;結合了百度多年的編程實戰數據和豐富的開源資源&#xff0c;形成了一款嶄新的編碼輔助利器。它不僅具備著高智能、多場景、價值創造的特質&#xff0c;更可廣泛應用于各…

實物仿真平臺設計方案:927-8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺

8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺 一、平臺介紹 產品基于8路GMSL視頻注入回灌的自動駕駛半實物仿真平臺旨在提高實驗室及研究生院師生在基礎軟件層開發、計算機視覺和深度學習方面的專業知識學習和實踐能力&#xff0c;為師生提供一個穩定軟件開發和多精度框…

匯編個位數求和實驗

title: 匯編求和實驗 keywords: 匯編 tags: [匯編] categories: 嵌入式 匯編求和實驗 剛開始學習匯編 給大家做個參考 實驗 5 子程序 5.1 實驗目的 ①掌握利用堆棧傳遞參數的子程序調用方法。 ②過程調用偽指令&#xff1a;PROC&#xff0c;ENDP&#xff0c;NEAR和FAR。 ③8088…

神經網絡權重初始化學習

在神經網絡中&#xff0c;權重初始化是一個關鍵步驟&#xff0c;它影響著模型的訓練效率和最終性能。使用正態分布作為初始值是一種常見且有效的策略&#xff0c;尤其是在深度學習中。 原理 為何使用分布初始化&#xff1f; 如果所有權重初始化為相同的值&#xff08;如全零初…

hive日常使用時忘記部分補充(不定時)

1、date_formate、unix_timestamp、from_unixtime用法&#xff1a; 2、lag&#xff08;&#xff09;、lead()用法&#xff1a; lag&#xff08;)窗口函數返回分區中當前行之前行&#xff08;可以指定第幾行&#xff09;的值。 如果沒有行&#xff0c;則返回null。 lead()窗口…

pytest + yaml 框架 - 錄制接口轉 yaml 用例實現

pytest yaml 框架基本不用寫 python 代碼&#xff0c;只需寫yaml 文件用例就能實現接口自動化。 現在引入接口錄制功能&#xff0c;連 yaml 文件也不用寫了&#xff0c;點點點就能生成 yaml 用例文件了。 錄制功能在v1.3.4版本上實現 pip instal pytest-yaml-yoyo 環境準備 …