zoukankan      html  css  js  c++  java
  • 93. Restore IP Addresses

    问题:

    给定一串由数字构成的字符串。

    给任意两个数字间添加'.',一共加3次,求能得到的所有有效的IP格式。

    Example 1:
    Input: s = "25525511135"
    Output: ["255.255.11.135","255.255.111.35"]
    
    Example 2:
    Input: s = "0000"
    Output: ["0.0.0.0"]
    
    Example 3:
    Input: s = "1111"
    Output: ["1.1.1.1"]
    
    Example 4:
    Input: s = "010010"
    Output: ["0.10.0.10","0.100.1.0"]
    
    Example 5:
    Input: s = "101023"
    Output: ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"] 
    
    Constraints:
    0 <= s.length <= 3000
    s consists of digits only.
    

    解法:backtracking(回溯算法)

    参数:

    • path:到目前为止“.”添加后的情况。
      • pos:给定字符串s的位置(上一个“.”结束,下一个可用字符位置)
      • n:已经使用的“.”的个数
    • optionlists:pos的下一个位置开始~s的结尾。(除去不合要求的数字,使用isValid进行check)

    处理:

      • 退出条件:if(n==3) (“.”已被用完)则标记需要return
        • 若:pos~s的结尾,构成的字符串符合要求(isValid()==true)则将<path+最后的字符串>加入res中。
      • for所有可选项:opt=[pos+1~size()) &&( isValid == true )
    • 做选择:
      • path+tmp+"."
      • n+1
      • pos=i
    • 递归:
      • backtracking(path+tmp+".", n+1,i,s) 
    • 撤销选择:path,n
    • isValid:
      • 传入IP区段字符串tmp->int,满足:[0~255] 且 int->string == tmp(排除"010"这种以0开头又不等于0的数字字符串)

    代码参考:

     1 class Solution {
     2 public:
     3     bool isValid(string s) {
     4         int ipfield = atoi(s.c_str());
     5         string ip = to_string(ipfield);
     6         if(ipfield >= 0 && ipfield <= 255 && ip == s) return true;
     7         return false;
     8     }
     9     void backtrack(vector<string>& res, string path, int pos, string s, int n) {
    10         if(n == 3) {
    11             string tmp = s.substr(pos);
    12             if(isValid(tmp)) {
    13                 res.push_back(path+tmp);
    14             }
    15             return;
    16         }
    17         for(int i = pos+1; i < s.size(); i++) {
    18             string tmp = s.substr(pos, i-pos);
    19             if(isValid(tmp)) {
    20                 backtrack(res, path+tmp+".", i, s, n+1);
    21             } else return;
    22         }
    23     }
    24     vector<string> restoreIpAddresses(string s) {
    25         vector<string> res;
    26         string path;
    27         backtrack(res, path, 0, s, 0);
    28         return res;
    29     }
    30 };
  • 相关阅读:
    10.23继承
    10.22语法 class 类 面向对象概念 类与对象 对象的使用 绑定方法
    10.18
    10.16
    读书笔记-软技能:代码之外的生存指南
    git reset
    阿里云安装samba
    关于svn由于目标计算机积极拒绝,无法连接的解决办法
    yii2简单安装
    指定路径创建中文文件名并存入内容
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/14242736.html
Copyright © 2011-2022 走看看