大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
93. 复原IP地址
题目描述
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
代码
官方题解递归
class Solution {
static final int SEG_COUNT = 4;
List<String> ans = new ArrayList<String>();
int[] segments = new int[SEG_COUNT];
public List<String> restoreIpAddresses(String s) {
segments = new int[SEG_COUNT];
dfs(s, 0, 0);
return ans;
}
public void dfs(String s, int segId, int segStart) {
// 如果找到了 4 段 IP 地址并且遍历完了字符串,那么就是一种答案
if (segId == SEG_COUNT) {
if (segStart == s.length()) {
StringBuffer ipAddr = new StringBuffer();
for (int i = 0; i < SEG_COUNT; ++i) {
ipAddr.append(segments[i]);
if (i != SEG_COUNT - 1) {
ipAddr.append('.');
}
}
ans.add(ipAddr.toString());
}
return;
}
// 如果还没有找到 4 段 IP 地址就已经遍历完了字符串,那么提前回溯
if (segStart == s.length()) {
return;
}
// 由于不能有前导零,如果当前数字为 0,那么这一段 IP 地址只能为 0
if (s.charAt(segStart) == '0') {
segments[segId] = 0;
dfs(s, segId + 1, segStart + 1);
}
// 一般情况,枚举每一种可能性并递归
int addr = 0;
for (int segEnd = segStart; segEnd < s.length(); ++segEnd) {
addr = addr * 10 + (s.charAt(segEnd) - '0');
if (addr > 0 && addr <= 0xFF) {
segments[segId] = addr;
dfs(s, segId + 1, segEnd + 1);
} else {
break;
}
}
}
}
暴力循环三个小数点
解题思路
- 先过滤不符合条件的ip字符串
- for循环截取字符串长度1~3, 再判断截取字符串是否符合条件,剩余字符串是否符合条件
class Solution {
public List<String> restoreIpAddresses(String s) {
List<String> r = new ArrayList<>();
if(s.length() > 12) return r;
for(int i = 1; i < s.length() && i <= 3; ++i){
for(int j = i; j < s.length() && j <= i + 3; ++j){
for(int k = j; k < s.length() && k <= j + 3; ++k){
String s1 = s.substring(0, i);
String s2 = s.substring(i, j);
String s3 = s.substring(j, k);
String s4 = s.substring(k);
if(f(s1)&&f(s2)&&f(s3)&&f(s4)){
StringBuilder sb = new StringBuilder();
sb.append(s1); sb.append(".");
sb.append(s2); sb.append(".");
sb.append(s3); sb.append(".");
sb.append(s4);
r.add(sb.toString());
}
}
}
}
return r;
}
boolean f(String s){
if(s.length() == 0) return false;
if(s.length() == 1) return true;
if(s.length() > 3) return false;
if(s.charAt(0) == '0') return false;
if(Integer.parseInt(s) <= 255) return true;
return false;
}
}
提交结果
2020年8月9日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn