问题:
方法:
主要思路是DFS,穷举所有可能的情况,递归所有组合,然后根据IP的规则进行过滤,即每小段只能为3位,且不大于255,小段数只能为4,最后输出符合规则的所有结果。
具体实现:
class RestoreIPAddresses {
fun restoreIpAddresses(s: String): List<String> {
val result = mutableListOf<String>()
if (s.isEmpty() || s.length > 12) {
return result
}
dfs(s, 0, "", result, 0)
return result
}
private fun dfs(s: String, end: Int, ip: String, result: MutableList<String>, count: Int) {
for (start in end..end + 2) {
val ipSegment = s.substring(end..start)
if (ipSegment.length > 1 && ipSegment[0] == '0') {
break
}
if (ipSegment.toInt() > 255) {
break
}
if (start == s.lastIndex) {
if (count == 3) {
result.add("$ip.$ipSegment")
}
break
}
if (ip != "") {
dfs(s, start + 1, "$ip.$ipSegment", result, count+1)
} else {
dfs(s, start + 1, ipSegment, result, count+1)
}
}
}
}
fun main(args: Array<String>) {
val input = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"
val restoreIPAddresses = RestoreIPAddresses()
CommonUtils.printArray(restoreIPAddresses.restoreIpAddresses(input).toTypedArray())
}
有问题随时沟通