zoukankan      html  css  js  c++  java
  • Leetcode 93. 复原 IP 地址 dfs

    地址 https://leetcode-cn.com/problems/restore-ip-addresses/

    给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。
    你可以按任何顺序返回答案。
    有效 IP 地址 正好由四个整数
    (每个整数位于 0 到 255 之间组成,且不能含有前导 0),
    整数之间用 '.' 分隔。
    例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,
    但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
    
    示例 1:
    输入:s = "25525511135"
    输出:["255.255.11.135","255.255.111.35"]
    
    示例 2:
    输入:s = "0000"
    输出:["0.0.0.0"]
    
    示例 3:
    输入:s = "1111"
    输出:["1.1.1.1"]
    
    示例 4:
    输入:s = "010010"
    输出:["0.10.0.10","0.100.1.0"]
    
    示例 5:
    输入:s = "101023"
    输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
     
    
    提示:
    0 <= s.length <= 3000
    s 仅由数字组成
    

    解法:
    dfs 遍历尝试各个字符的组合,去除恰好用完整个字符而且合法且刚好分为4段的正确答案.
    以 s = "25525511135" 为例
    2.55.2 错误在于就是没用用完整个字符串
    255.255.1.11.3.5 错误在于没有刚好分为4段
    2552.55.111.35 错误在于ip字段不合法(2552)

    class Solution {
    public:
    	vector<string> ans;
    
    	void dfs(int idx, const string& s, int ipidx, string& ips) {
    		if (idx >= s.size() && ipidx == 4) {
    			ans.push_back(ips);
    			return;
    		}
    
    		else if (idx >= s.size() || ipidx > 4) { return; }
    
    		for (int i = 0; i < 3; i++) {
    			if (idx + i < s.size()) {
    				string fillS = s.substr(idx, i + 1);
    				if (fillS.size() == 2 && fillS[0] == '0') continue;
    				if (fillS.size() == 3 && (fillS[0] > '2' || fillS[0] == '0' || (fillS[0] == '2' && fillS[1] > '5') || 
    						(fillS[0] == '2'&&  fillS[1] == '5'&&fillS[2] > '5')) )
    				{
    					return;
    				}
    
    				string copy = ips + fillS;
    				ipidx++;
    				if (ipidx < 4)
    					copy.push_back('.');
    				dfs(idx + i + 1, s, ipidx, copy);
    				ipidx--;
    
    			}
    		}
    	}
    
    	vector<string> restoreIpAddresses(string s) {
    		string ips;
    		dfs(0, s, 0, ips);
    
    		return ans;
    	}
    };
    

    我的视频空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/itdef/p/14812158.html
Copyright © 2011-2022 走看看