首页 > 其他 > 详细

复原IP地址-DFS

时间:2020-05-13 15:50:36      阅读:40      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

dfs递归枚举每个点分片段的数字是否合法

class Solution {
  public:
      bool isValid(string ip)
      {
          int val = stoi(ip);
          if (val > 255)    
              return false;
          if (ip.size() >= 2 && ip[0] == 0)
              return false;
          return true;
      }
      void dfs(string& s, int pos, vector<string> &path, vector<string>& res)
      {
          //首先判断剩余的位数,是不是还能满足要求,比如25525511135,若2.5.5.25511135显然不满足,这可以预判
          int maxLen = (4 - path.size()) * 3;

          if (s.size() - pos > maxLen)    
              return;
          //递归出口
          if (path.size() == 4 && pos == s.size()) {
              string ans = "";
              for (int i = 0; i < 4; ++i) {
                  ans += path[i];
                  if (i != 3)    
                      ans += ".";
              }
              res.push_back(ans);
              return;
          }
          //一个片段最多包含三个字符
          for (int i = pos; i < s.size() && i <= pos + 2; ++i) {
              string ip = s.substr(pos, i - pos + 1);
              //判断提取的字符片段是否合法
              if (!isValid(ip))    
                  continue;
              path.push_back(ip);
              dfs(s, i + 1, path, res);
              //回溯、删除最后一个元素
              path.pop_back();
          }
      }
      vector<string> restoreIpAddresses(string s)
      {
          //找3个.的位置,每个.之前组成的的数值必须要小于255,且以0开头的除非数字是0本身,否则也是非法
          vector<string> res;
          if (s.size() == 0 || s.size() < 4)    
              return res;
          //path保存分成四组的字符串
          vector<string> path;
          dfs(s, 0, path, res);
          return res;
      }
  };

 

复原IP地址-DFS

原文:https://www.cnblogs.com/-citywall123/p/12882238.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!