网站icp备案网址,wordpress菜单不现实,天河区门户信息网,建设企业查询网站有效 IP 地址 正好由四个整数#xff08;每个整数位于 0 到 255 之间组成#xff0c;且不能含有前导 0#xff09;#xff0c;整数之间用 . 分隔。 例如#xff1a;0.1.2.201 和 192.168.1.1 是 有效 IP 地址#xff0c;但是 0.011.255.24… 有效 IP 地址 正好由四个整数每个整数位于 0 到 255 之间组成且不能含有前导 0整数之间用 . 分隔。 例如0.1.2.201 和 192.168.1.1 是 有效 IP 地址但是 0.011.255.245、192.168.1.312 和 192.1681.1 是 无效 IP 地址。 给定一个只包含数字的字符串 s 用以表示一个 IP 地址返回所有可能的有效 IP 地址这些地址可以通过在 s 中插入 . 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。 输入s 25525511135
输出[255.255.11.135,255.255.111.35] 分割字符串的方法一般都是用回溯法进行解决将所有的情况枚举出来回溯法类似于一个树型结构 递归参数 在这些对顺序有要求的回溯中startIndex一定是需要的因为不能重复分割记录下一层递归分割的起始位置本题我们还需要一个变量pointNum记录添加逗点的数量。
所以代码如下 ListString list new ArrayList();int pointNum0;public ListString restoreIpAddresses(String s) {if (s null || s.length() 0) {return list;}backtracking(s,0,0);return list;}
递归终止条件 本题明确要求只会分成4段所以不能用切割线切到最后作为终止条件而是分割的段数作为终止条件pointNum表示逗点数量pointNum为3说明字符串分成了4段了然后验证一下第四段是否合法如果合法就加入到结果集里
代码如下 if(pointNum3){//判断最后一个点后面是否合法if (isVaild(s,startIndex,s.length()-1)){list.add(s);}return;}
单层搜索的逻辑 在for (int i startIndex; i s.size(); i)循环中 [startIndex, i] 这个区间就是截取的子串需要判断这个子串是否合法如果合法就在字符串后面加上符号.表示已经分割如果不合法就结束本层循环如图中剪掉的分支 然后就是递归和回溯的过程 递归调用时下一层递归的startIndex要从i2开始因为需要在字符串中加入了分隔符.同时记录分割符的数量pointNum 要 1回溯的时候就将刚刚加入的分隔符. 删掉就可以了pointNum也要-1。
代码如下 for (int i startIndex; i s.length(); i) {if(isVaild(s,startIndex,i)){//加逗号ss.substring(0,i1).s.substring(i1);pointNum;//逗号也占了一个位置所以是i2backtracking(s,i2,pointNum);//回溯ss.substring(0,i1)s.substring(i2);pointNum--;}else{break;} 判断子串是否合法
最后就是在写一个判断分割是否是有效分割了。
主要考虑到如下三点
段位以0为开头的数字不合法段位里有非正整数字符不合法段位如果大于255了不合法
代码如下
// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法
bool isValid(const string s, int start, int end) {if (start end) {return false;}if (s[start] 0 start ! end) { // 0开头的数字不合法return false;}int num 0;for (int i start; i end; i) {if (s[i] 9 || s[i] 0) { // 遇到非数字字符不合法return false;}num num * 10 (s[i] - 0);if (num 255) { // 如果大于255了不合法return false;}}return true;
}