LeetCode93 復原IP地址
阿新 • • 發佈:2022-03-03
題目
有效 IP 地址 正好由四個整數(每個整數位於 0 到 255 之間組成,且不能含有前導 0),整數之間用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312"
和 "[email protected]" 是 無效 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 僅由數字組成
方法
回溯法
如果start=s.length()&&deepth=COUNT滿足條件加入結果列表中
如果是0當前數直接是0
- 時間複雜度:O(O(3^COUNT ×∣s∣))每位不超過3個數,每個回溯只能COUNT層,如果滿足條件放入陣列要用|s|
- 空間複雜度:O(COUNT)
class Solution { static final int COUNT = 4; List<String> ans = new ArrayList<>(); int[] ipNum = new int[COUNT]; public List<String> restoreIpAddresses(String s) { dfs(s,0,0); return ans; } private void dfs(String s,int deepth,int start){ if(start==s.length()&&deepth==COUNT){ StringBuffer str = new StringBuffer(); for(int i=0;i<COUNT;i++){ str.append(ipNum[i]); if(i!=COUNT-1){ str.append("."); } } ans.add(str.toString()); return; } if(start==s.length()||deepth==COUNT) return; if(s.charAt(start)=='0'){ ipNum[deepth] = 0; dfs(s,deepth+1,start+1); } int num = 0; for(int i = start;i<s.length();i++){ num = num*10+(s.charAt(i)-'0'); if(num>0&&num<=0xFF){ ipNum[deepth] = num; dfs(s,deepth+1,i+1); }else{ break; } } } }