近日在面试美团的时候手撕一道回溯法的算法题,题意如下:
给定一个数字字符串,要求将这个数字字符串进行分割,使得分割的结果为有效的IP地址。
样例输入:
25525511135
样例输出:
255.255.11.135, 255.255.111.35
这道题其实可以看做是字符串分段问题,再输入的字符串中加入三个点,将字符串分割成四段,每一段必须合法,求所有可能的情况。目前遇到字符串的处理经验为:1、若题目问的是字符串的子序列问题首先考虑使用动态规划的方法,2、如果题目问的是求出所有可能的情况,那么首先考虑使用递归的方法。所以这道题使用递归的方法求解。
使用n表示当前已经分了几个分段,注意到此处的输入为字符串类型,那么如果想将将其转化成int类型变量的话可以先使用c_str()函数将其转化成字符数组,然后使用atoi()函数将其转化成int型数据,这样就可以和0-255这个范围进行比较了。
递归的大致思路如下:
1. 将最后的结果存入一个全局的字符串向量res中。
2. 递归的函数有四个参数,分别是剩下的字符串s,已经分段的个数n,分割过程中产生的临时结果out,结果向量res。
3. 如果已经完成了四段的分割,那么将结果push_back()入res中
4. 否则的话,下一个分段的长度为1-3,对于每一种长度,都要求大小在0-255之间,而且除了0以外不能够以0开头。如果满足条件的话。进入5。
5.递