复原IP地址-DFS

 

 

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;
      }
  };

 

posted @ 2020-05-13 14:41  知道了呀~  阅读(252)  评论(0编辑  收藏  举报