Leetcode---Restore IP Addresses

本文详细阐述了如何通过深度优先搜索(DFS)算法解决给定字符串中所有可能的有效IP地址组合的问题,包括验证子字符串的有效性及递归过程的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

For example:
Given "25525511135",

return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)


Have you been asked this question in an interview?

还是DFS,关键是只能分4段,所以需要在DFS的时候限制递归的层数,可以使用一个全局变量num来存储,进入递归函数时num++,从递归函数return后num--。


  1. int num=0;
  2. bool isvalid(string& s,int i,int j){
  3.     if(i<j && s[i]=='0')
  4.         return false;
  5.     if(j-i+1>3)
  6.         return false;
  7.     else if(j-i+1==3){
  8.         if(s[i]=='2'){
  9.             if(s[i+1]=='5')
  10.                 return '0'<=s[i+2] && s[i+2]<='5';
  11.             else if('0'<=s[i+1] && s[i+1]<'5')
  12.                 return true;
  13.             else if(s[i+1]>'5' && s[i+1]<='9')
  14.                 return false;
  15.             else
  16.                 return false;
  17.         }
  18.         else if(s[i]>'2' && s[i]<='9')
  19.             return false;
  20.         else if(s[i]=='1')
  21.             return true;
  22.         else
  23.             return false;
  24.     }
  25.     else if(j-i+1==2)
  26.         return '0'<=s[i] && s[i]<='9' && '0'<=s[i+1] && s[i+1]<='9';
  27.     else
  28.         return '0'<=s[i] && s[i]<='9';
  29. }
  30. vector<string> f(string& s,int i,int j){
  31.     num++;
  32.     vector<string> result;
  33.     if(j-i+1>12)
  34.         return result;
  35.     if(num==4){
  36.         if(isvalid(s,i,j))
  37.             result.push_back(s.substr(i,j-i+1));
  38.     }else{
  39.         for(int k=i;k<j;k++){
  40.             if(isvalid(s,i,k)){
  41.                 vector<string> right=f(s,k+1,j);
  42.                 for(int m=0;m<right.size();m++){
  43.                     string tmp=s.substr(i,k-i+1)+'.'+right[m];
  44.                     result.push_back(tmp);
  45.                 }
  46.                 num--;
  47.             }
  48.         }
  49.     }
  50.     return result;
  51. }
  52. vector<string> restoreIpAddresses(string s) {

  53.     return f(s,0,s.size()-1);
  54. }


<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(1) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值