[LeetCode] 93. Restore IP Addresses 复原IP地址
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
解法:Backtracking
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class Solution { public List<String> restoreIpAddresses(String s) { List<String> res = new ArrayList<String>(); int len = s.length(); for ( int i = 1 ; i< 4 && i<len- 2 ; i++){ for ( int j = i+ 1 ; j<i+ 4 && j<len- 1 ; j++){ for ( int k = j+ 1 ; k<j+ 4 && k<len; k++){ String s1 = s.substring( 0 ,i), s2 = s.substring(i,j), s3 = s.substring(j,k), s4 = s.substring(k,len); if (isValid(s1) && isValid(s2) && isValid(s3) && isValid(s4)){ res.add(s1+ "." +s2+ "." +s3+ "." +s4); } } } } return res; } public boolean isValid(String s){ if (s.length()> 3 || s.length()== 0 || (s.charAt( 0 )== '0' && s.length()> 1 ) || Integer.parseInt(s)> 255 ) return false ; return true ; } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public List<String> restoreIpAddresses(String s) { List<String> solutions = new ArrayList<String>(); restoreIp(s, solutions, 0 , "" , 0 ); return solutions; } private void restoreIp(String ip, List<String> solutions, int idx, String restored, int count) { if (count > 4 ) return ; if (count == 4 && idx == ip.length()) solutions.add(restored); for ( int i= 1 ; i< 4 ; i++) { if (idx+i > ip.length()) break ; String s = ip.substring(idx,idx+i); if ((s.startsWith( "0" ) && s.length()> 1 ) || (i== 3 && Integer.parseInt(s) >= 256 )) continue ; restoreIp(ip, solutions, idx+i, restored+s+(count== 3 ? "" : "." ), count+ 1 ); } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public class Solution { public List<String> restoreIpAddresses(String s) { List<String> res = new ArrayList<String>(); for ( int a = 1 ; a < 4 ; ++a) for ( int b = 1 ; b < 4 ; ++b) for ( int c = 1 ; c < 4 ; ++c) for ( int d = 1 ; d < 4 ; ++d) if (a + b + c + d == s.length()) { int A = Integer.parseInt(s.substring( 0 , a)); int B = Integer.parseInt(s.substring(a, a + b)); int C = Integer.parseInt(s.substring(a + b, a + b + c)); int D = Integer.parseInt(s.substring(a + b + c)); if (A <= 255 && B <= 255 && C <= 255 && D <= 255 ) { String t = String.valueOf(A) + "." + String.valueOf(B) + "." + String.valueOf(C) + "." + String.valueOf(D); if (t.length() == s.length() + 3 ) res.add(t); } } return res; } } |
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Solution { public List<String> restoreIpAddresses(String s) { List<String> res = new ArrayList<String>(); helper(s, 0 , "" , res); return res; } public void helper(String s, int n, String out, List<String> res) { if (n == 4 ) { if (s.isEmpty()) res.add(out); return ; } for ( int k = 1 ; k < 4 ; ++k) { if (s.length() < k) break ; int val = Integer.parseInt(s.substring( 0 , k)); if (val > 255 || k != String.valueOf(val).length()) continue ; helper(s.substring(k), n + 1 , out + s.substring( 0 , k) + (n == 3 ? "" : "." ), res); } } } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Solution: # @param s, a string # @return a list of strings def restoreIpAddresses( self , s): result = [] self .restoreIpAddressesRecur(result, s, 0 , "", 0 ) return result def restoreIpAddressesRecur( self , result, s, start, current, dots): # pruning to improve performance if ( 4 - dots) * 3 < len (s) - start or ( 4 - dots) > len (s) - start: return if start = = len (s) and dots = = 4 : result.append(current[: - 1 ]) else : for i in xrange (start, start + 3 ): if len (s) > i and self .isValid(s[start:i + 1 ]): current + = s[start:i + 1 ] + '.' self .restoreIpAddressesRecur(result, s, i + 1 , current, dots + 1 ) current = current[: - (i - start + 2 )] def isValid( self , s): if len (s) = = 0 or (s[ 0 ] = = '0' and s ! = "0" ): return False return int (s) < 256 |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | vector<string> restoreIpAddresses(string s) { vector<string> ret; string ans; for ( int a=1; a<=3; a++) for ( int b=1; b<=3; b++) for ( int c=1; c<=3; c++) for ( int d=1; d<=3; d++) if (a+b+c+d == s.length()) { int A = stoi(s.substr(0, a)); int B = stoi(s.substr(a, b)); int C = stoi(s.substr(a+b, c)); int D = stoi(s.substr(a+b+c, d)); if (A<=255 && B<=255 && C<=255 && D<=255) if ( (ans=to_string(A)+ "." +to_string(B)+ "." +to_string(C)+ "." +to_string(D)).length() == s.length()+3) ret.push_back(ans); } return ret; } |
类似题目:
[LeetCode] 17. Letter Combinations of a Phone Number 电话号码的字母组合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构