【Restore IP Addresses 】cpp
题目:
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
For example:
Given "25525511135"
,
return ["255.255.11.135", "255.255.111.35"]
. (Order does not matter)
代码:
- class Solution {
- public:
- vector<string> restoreIpAddresses(string s) {
- const int size = s.size();
- vector<string> ret;
- if ( size> || size< ) return ret;
- string tmp;
- int numDot = ;
- Solution::dfs(ret, tmp, s, , size-, numDot);
- return ret;
- }
- static void dfs( vector<string>& ret, string tmp, string& s, int begin, int end, int numDot)
- {
- if ( numDot== )
- {
- if ( Solution::valid(s.substr(begin,end-begin+)) )
- {
- tmp += s.substr(begin,end-begin+);
- ret.push_back(tmp);
- }
- return;
- }
- int localEnd = std::min(end, begin+);
- for ( int i=begin; i<=localEnd; ++i )
- {
- if ( Solution::valid(s.substr(begin,i-begin+)) )
- {
- Solution::dfs(ret, tmp+s.substr(begin, i-begin+)+".", s, i+, end, numDot-);
- }
- }
- }
- static bool valid( string tmp )
- {
- const int len = tmp.size();
- if ( len== || len> || (len> && tmp[]=='')) return false;
- int sum = ;
- for ( int i = ; i<len; ++i ) sum = sum* + tmp[i]-'';
- return sum<=;
- }
- };
tips:
这道题的基础算法模板还是dfs,但是自己却纠结了好久没有AC。
先不说这道题,之前刷过palindrome partitioning这道题(求一个字符串可能被分割出来的所有回文集合),第一感觉就是跟回文分割的这道题很像,觉得应该很轻松AC。
但很快陷入思维泥潭:
1. 什么时候dfs到下一层?
2. ‘.’这个字符是什么时候加到后面,用不用退出来,什么时候退出来?
最后参考了下面的blog(http://blog.csdn.net/linhuanmars/article/details/24683699)才恍然大悟。
1. 什么时候要dfs到下一层:
a) 需要dfs到下一层的时候呗(对于此题来说,一层就是IP地址中的一段,即两个'.'之间的部分;对于回文分割来说,就是一个回文字串)
b) 敢往下dfs是因为本层的结果是合理的(对于此题来说,合理就是意味着在本层begin到i之间的字符串代表的数字是合法的;对于回文分割来说,本层begin到i构成的字符串,是一个回文)
c) 细化深搜的剪枝条件(对于此题来说,每个IP子端最多有3位数字,且如果长度超过1不能以0开头;对于回文字子符串来说,至少一个元素肯定是回文,再往后走看能否继续是回文,直到走到不能走)
d) 光需要dfs到下一层是不够的,还要看限制条件是否允许dfs到下一层(对于此题来说,IP地址一共有四段,即最多dfs到第四层就必须终结了)
e) 由c)可知dfs的终结条件就是dfs到第四层(对于此题就是numDot==0,numDot初始化为3,每进一层就减1)
f) 对于d)的终止条件,会不会出现begin>end的情况?不会的。因为dfs一层每次增加一个元素,最多加到begin==end,此时经过valid函数判断是无效的,就什么都不做返回上一层,上一层已经到了begin==end的条件→结束,再返回上一层...
2. 如何处理‘.’这个字符:
a) 由于dfs一层代表IP地址的一个段,因此,必须保证进入下一层的时候,tmp的结尾是'.' (想明白这一点比较重要,不会纠结于tmp到底最后一个元素是什么的思维泥潭了)
b) '.'还影响到了终止条件,如果tmp中已经有了三个'.'了(即numDot==0),则下面的已经不需要再分支了,一股脑都加入tmp后面即可(算是一种剪枝策略吧)
完毕~
===================================
第二次过这道题,.011.这种形式的不合法,第一次忘记判断了,后面加入了就AC了。
- class Solution {
- public:
- vector<string> restoreIpAddresses(string s)
- {
- vector<string> ret;
- if ( s.size()> || s.size()< ) return ret;
- vector<string> tmp;
- Solution::dfs(ret, tmp, s);
- return ret;
- }
- static void dfs(vector<string>& ret, vector<string>& tmp, string s)
- {
- if ( tmp.size()== )
- {
- if ( Solution::isValid(s) )
- {
- tmp.push_back(s);
- string str = tmp[] + "." + tmp[] + "." + tmp[] + "." + tmp[];
- ret.push_back(str);
- tmp.pop_back();
- return;
- }
- }
- for ( int i=; i<=min((int)s.size(),); ++i )
- {
- if ( !Solution::isValid(s.substr(,i)) ) continue;
- tmp.push_back(s.substr(,i));
- Solution::dfs(ret, tmp, s.substr(i,s.size()-i+));
- tmp.pop_back();
- }
- }
- static bool isValid(string s)
- {
- int val = ;
- int len = s.size();
- if ( len== || len> || (len> && s[]=='')) return false;
- for ( int i=; i<s.size(); ++i ) val = val* + s[i]-'';
- return val<=;
- }
- };
【Restore IP Addresses 】cpp的更多相关文章
- 【leetcode】Restore IP Addresses
Restore IP Addresses Given a string containing only digits, restore it by returning all possible val ...
- 【LeetCode】93. Restore IP Addresses
Restore IP Addresses Given a string containing only digits, restore it by returning all possible val ...
- 93. Restore IP Addresses
题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...
- 93.Restore IP Addresses(M)
93.Restore IP Addresses Medium 617237FavoriteShare Given a string containing only digits, restore it ...
- LeetCode: Restore IP Addresses 解题报告
Restore IP Addresses My Submissions Question Solution Given a string containing only digits, restore ...
- LeetCode解题报告—— Reverse Linked List II & Restore IP Addresses & Unique Binary Search Trees II
1. Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass ...
- Leetcode 22. Generate Parentheses Restore IP Addresses (*) 131. Palindrome Partitioning
backtracking and invariant during generating the parathese righjt > left (open bracket and cloas ...
- leetcode -day29 Binary Tree Inorder Traversal & Restore IP Addresses
1. Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' ...
- leetcode 93. Restore IP Addresses(DFS, 模拟)
题目链接 leetcode 93. Restore IP Addresses 题意 给定一段序列,判断可能组成ip数的所有可能集合 思路 可以采用模拟或者DFS的想法,把总的ip数分成四段,每段判断是 ...
随机推荐
- node模拟后台返回json书写格式报错--Unexpected token ' in JSON at position 1
最近在学习Node的知识,就尝试写了一个注册登陆的简单功能,但是自己在模拟后台返回值的时候,总是报错Unexpected token ' in JSON at position 1,查找原因之后,是因 ...
- Android 环信 调用相机崩掉 mikdir()
protected void selectPicFromCamera() { if (!EaseCommonUtils.isSdcardExist()) { Toast.makeText(getAct ...
- 捷宇高拍仪XY530 网页集成总结
应甲方要求,需要把高拍仪集成到B/S系统中来,在集成过程中遇到的几点问题做为总结,以备查找. 1.甲方送来的高拍仪是淘宝上买来的,型号是XY530,功能非常简单,成像效果也很一般.如果没有其它要求,可 ...
- 正则表达式---01 js篇
本文主要针对js中正则表达式的实践操作,来让大家对正则表达式有一个入门清晰的了解. 正则表达式推荐学习网址:http://www.runoob.com/regexp/regexp-tutorial.h ...
- sql server 2012安装程序图
重点:下面的安装步骤都在断网环境下安装的 因为我想查看联网跟没有联网SQL2012会不会下载并安装.net2.0 和.net3.5和.net4和SP1补丁包 我的环境: 没有集成SP1补丁包的安装包大 ...
- 美国L-1A签证简介
一. L-1A签证是美国非移民签证种类之一,主要发给外国跨国公司在美所设公司的高层管理人员.申请程序是先经美国移民局批准,美驻外使领馆凭移民局的批准函(I-797表)核发签证.移民局的批准函并不意味着 ...
- Android中的Matrix(矩阵)
写在前面 看这篇笔记之前先看一下参考文章,这篇笔记没有系统的讲述矩阵和代码的东西,参考文章写的也有错误的地方,要辨证的看. 如何计算矩阵乘法 android matrix 最全方法详解与进阶(完整篇) ...
- CUDA编程时,线程块的处理方法
- v4l2解析
v4l2的学习建议和流程解析: http://www.cnblogs.com/silence-hust/p/4464291.html 补充: 枚举设备所支持的image format: VIDIOC_ ...
- split 分割压缩文件
1.普通tar压缩命令 tar -zcvf cm-11.tar.gz cm-11 //将cm-11文件夹压缩成cm-11.tar.gz 2.压缩后的文件太大,需要将cm-11.tar.gz分割成N个指 ...