leetcode 93.复原ip地址

  1. 易错点

    1. 截取表头子串cur时,下标不能越界!!! index<s.size()&&index<3;
    2. cur若含有前导0务必立马舍弃,不能用stoi及to_string()去除前导零.有前导零== size>1 && s[0]=='0';单独的"0"不算
    3. 用substr()截取子串时务必确认起始位置不越界,否则会抛出out_of_range
    4. 0号-2号的ip段(前三个段)需在有效数字串后面加点
    5. 用已经记录的ip段数n来确定出口,若n==4,检查剩下的输入串长度是否恰好为0,若是将收集串tmp压入输出串ans中
    6. 注意修改参数进行下一层递归时,尽量用临时值传参而不要修改全局量,否则递归结束需要恢复现场
    7. #include <string>
      #include <vector>
      using namespace std;
      //s.substr(起始位置,长度),不加长度默认到末位;
      class Solution {
      public:
          
          bool valid(string &s)
          {
              //有前导0立刻丢弃-即字符个数大于1且首位为0;如果是"0"则不必
              if(s.size()>1 && s[0]=='0')
                  return false;
      
              int num = stoi(s);
              if(num > 255)
                  return false;
              return true;
          }
      
          //输出串ans,剩余输入串,收集串,已转换的IP段数
          //如果IP数段已经4个,检查剩下的输入串长度是否为0,若为tmp有效,压入ans中,返回
          //同一层分别截取输入串的表头1-3位子串cur,若数值有效则dfs(ans,s-cur,tmp+cur,n+1)
      
          void DFS(vector<string> &ans,string s,string tmp,int n)
          {
              if(n==4)
              {
                  if(s.empty())
                      ans.push_back(tmp);
                  return;
              }
              if(s.empty())
                  return;
      
              string cur;
              //for(int i = 0; i < 3; ++i)务必检查是否越界
              for(int i = 0;i<s.size() && i<3; ++i)
              {
                  cur += s[i];
                  //先检查是否有前导0,有则跳过;否则检查数值有效性
                  if(valid(cur))
                  {
                      string tmp1=tmp+cur;
                      if(n<3)
                          tmp1+='.';//0-2号段需要在后面加点
                      string sub=s.substr(i+1);
                      DFS(ans,sub,tmp1,n+1);
                  }
              }
          }
          vector<string> restoreIpAddresses(string s) {
              if(s.size()<4)
                  return {};
              
              vector<string> ans;
              DFS(ans,s,"",0);
              return ans;
          }
      };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值