题目:

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的更多相关文章

  1. 【leetcode】Restore IP Addresses

    Restore IP Addresses Given a string containing only digits, restore it by returning all possible val ...

  2. 【LeetCode】93. Restore IP Addresses

    Restore IP Addresses Given a string containing only digits, restore it by returning all possible val ...

  3. 93. Restore IP Addresses

    题目: Given a string containing only digits, restore it by returning all possible valid IP address com ...

  4. 93.Restore IP Addresses(M)

    93.Restore IP Addresses Medium 617237FavoriteShare Given a string containing only digits, restore it ...

  5. LeetCode: Restore IP Addresses 解题报告

    Restore IP Addresses My Submissions Question Solution Given a string containing only digits, restore ...

  6. 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 ...

  7. Leetcode 22. Generate Parentheses Restore IP Addresses (*) 131. Palindrome Partitioning

    backtracking and invariant during generating the parathese righjt > left  (open bracket and cloas ...

  8. leetcode -day29 Binary Tree Inorder Traversal &amp; Restore IP Addresses

    1.  Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' ...

  9. leetcode 93. Restore IP Addresses(DFS, 模拟)

    题目链接 leetcode 93. Restore IP Addresses 题意 给定一段序列,判断可能组成ip数的所有可能集合 思路 可以采用模拟或者DFS的想法,把总的ip数分成四段,每段判断是 ...

随机推荐

  1. Java栈,PC寄存器,本地方法栈,堆,方法区(静态区)和运行常量池

    详情参考:https://my.oschina.net/wangsifangyuan/blog/711329 前言:当要判断一个变量存在什么空间上哪儿时,先分析它是哪一种(是实例变量还是局部变量),实 ...

  2. IE Proxy Swich - IE 代理切换工具

    通过此工具可方便的切换计算机系统代理设置的开关,无需重启IE 来激活设置 下载 环境要求: 可能需要.NET 4.0 以上平台, 其他平台未测试 截图与功能如下 支持快捷方式参数 我个人习惯是在桌面 ...

  3. hiho一下 第三十八周 二分答案

    题目链接:http://hihocoder.com/contest/hiho38/problem/1 ,挺难想的解题思路,好题. 按照提示的算法来: 我们需要找什么? 在这个题目中我们需要找的是路径最 ...

  4. pat甲级1012

    1012 The Best Rank (25)(25 分) To evaluate the performance of our first year CS majored students, we ...

  5. html body上有一条空白!!!

    html body 上莫名其妙的就出现了一条空白,怎么搞都搞不定,弄了一下午...... 解决了!!! 格式问题/

  6. IOS Quartz2D自定义view

    @property (nonatomic, weak) UIImageView *imageView; @property (nonatomic, weak) NJImageView *njIv; @ ...

  7. json字符串转换成对象需要注意的问题

    json转换成对象的时候应该尽量避免出现特殊的符号,如“\”这样的字符在转义成数组的时候会被去除掉,最好的例子就是后台返回的内容为存储路径的JSON,这时候最好是把一个斜杠变为两个斜杠,如: [{&q ...

  8. 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)

    点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...

  9. 2013年6月 最新Godaddy(持续更新)

    关于Godaddy Godaddy 是世界上最大的域名注册商,Godaddy管理的域名超过5000万.同时,Godaddy也是最大的主机服务商,据多家监测机构显示,放置在Godaddy上的网站数量已经 ...

  10. CUDA:Supercomputing for the Masses (用于大量数据的超级计算)-第五节

    原文链接 第五节:了解和使用共享内存(2) Rob Farber 是西北太平洋国家实验室(Pacific Northwest National Laboratory)的高级科研人员.他在多个国家级的实 ...