【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数分成四段,每段判断是 ...
随机推荐
- Android compress 压缩 会不会失真
微信的缩略图要求是不大于32k,这就需要对我的图片进行压缩.试了几种方法,一一道来. 代码如下 ByteArrayOutputStream baos = new ByteArrayOutputStre ...
- “ipconfig不是内部命令或外部命令”解决方法
第一:用鼠标右键单击“计算机”,在弹出的下拉菜单中选择“属性”. 第二:在系统属性中选择“高级系统设置”.在系统属性对话框中找到其上方的“高级”选项卡,里面有一个“环境变量”按钮,点击进入 第三:在下 ...
- 【BZOJ2754】[SCOI2012] 喵星球上的点名(后缀数组+莫队)
点此看题面 大致题意: 每个人的名字由姓和名构成,如果某次点名点到的字符串是某人姓或名的一个子串,则这个人就被点到了.求每次点名被点到的人的个数及每个人被点到的总次数. 后缀数组+莫队 这道题做法很多 ...
- for循环和数组练习
//公鸡2文,母鸡1文,小鸡半文,每种至少一只,100文买100只鸡有多少种可能 var ci =0; for(var g=1;g<50;g++){ for(var m=1;m<100;m ...
- JQuery根据关键字检索html元素并筛选显示
背景:标题比较唬人,实际上就是在文本框中输入关键字,通过关键字检索html元素,筛选后显示在界面上. Html元素如下: <div> <input type="text&q ...
- 01_13_JSP编译指令
01_13_JSP编译指令 1. Directive Directive(编译指令)相当于在编译期间的命令 格式: <%@Directive 属性=”属性值”%> 常见的Directive ...
- ES6学习(二):函数的扩展
chapter07 函数的扩展 7.1 函数默认值 7.1.1 参数默认值简介 传统做法的弊端(||):如果传入的参数相等于(==)false的话,仍会被设为默认值,需要多加入一个if判断,比较麻烦. ...
- 短短几行css代码实现滚动条效果
如何实现使用css实现滚动条效果 实现效果,运用线性渐变来实现功能 假设我们的页面被包裹在 <body> 中,可以滚动的是整个 body,给它添加这样一个从左下到到右上角的线性渐变: bo ...
- 30. 与所有单词相关联的字串、java实现
题目描述: 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能有其他字符, ...
- HH的项链题解(离线思想+链表+树状数组)
本人第一篇博客重磅推出!!! 希望各位朋友以后多多捧场也多给写意见(我个人喜欢把题解写得啰嗦一点,因为这样方便理解,各位巨佬勿喷) 来讲一道提高+/省选-的骚题:HH的项链(这个HH你理解成皇后呵呵哈 ...