原题链接:https://leetcode-cn.com/problems/restore-ip-addresses/description/
题目描述:
知识点:递归,回溯
基本思路:
(1)在题给的Solution类里新建一个私有的List<String>类型的成员变量res,用来保存返回值。
(2)设计一个私有的函数generateIpAddresses(String ipAddress, String s),该函数的意义是:在ipAddress中已经存了n - 1个数字和n - 1个点,寻找下一个数字,即第n个数字,获得存放了n个数字和n个点的ipAddress。
(3)在generateIpAddresses(String ipAddress, String s)里我们首先计算ipAddress中的'.'字符串的数量,记为n。如果n为3,则说明s中除去ipAddress中有的字符外剩下的字符都需要放进ipAddress中了,我们记该剩余字符串为lastString。如果lastString包含的字符数大于等于4,我们直接判断该字符串不满足ip地址的定义,直接return。如果lastString包含的字符数大于1,但是lastString的第一个字符是‘0’,这也不满足ip地址的定义,直接return。如果lastString转换为integer的值满足大于等于0,小于等于255,则满足ip地址的定义,我们将该ipAddress加入到res中,并返回。
(4)寻找ipAddress的下一个数字,下一个数字总共有3种可能,可能是1位数、2位数或者3位数。于是,我们可以设立一个数组nextString[3],数组中的每一个元素记录一种可能性。同时ipAddress包含的数字数加上下一个数字的数字数必须小于等于字符串s包含的数字数。同(3)中一样,如果nextString[i]包含的字符数大于1,但是lastString的第一个字符是‘0’,这也不满足ip地址的定义,直接continue判断下一个nextString[i]。如果说nextString[i]转换为integer的值满足大于等于0,小于等于255,则满足ip地址的定义,我们就将nextString[i] + "." 加入到ipAddress中,并继续递归地调用函数generateIpAddresses(String ipAddress, String s)。(这里我们不需要对ipAddress这个变量进行回溯维护,因为在java中,String类型的变量在函数调用过程中传递的是值,不是地址,我们继续递归地调用该函数,不会改变ipAddress的值。)
(5)在restoreIpAddresses(String s),如果s != "",我们直接调用generateIpAddresses(String ipAddress, String s),返回res。
JAVA代码:
public class Solution {
private List<String> res;
public List<String> restoreIpAddresses(String s) {
res = new ArrayList<>();
if(s.length() == 0) {
return res;
}
generateIpAddresses("", s);
return res;
}
/*
* 在ipAddress中已经存了n - 1个数字和n - 1个点,寻找第n个数字,获得存放了n个数字的ipAddress
*/
private void generateIpAddresses(String ipAddress, String s) {
int n = 0;
for (int i = 0; i < ipAddress.length(); i++) {
if(ipAddress.charAt(i) == '.') {
n++;
}
}
if(n == 3) {
if(ipAddress.length() - 3 < s.length()) {
String lastString = s.substring(ipAddress.length() - 3);
if(lastString.length() >= 4) {
return;
}
if(lastString.length() != 1 && lastString.charAt(0) == '0') {
return;
}
if(Integer.valueOf(lastString) >= 0 && Integer.valueOf(lastString) <= 255) {
res.add(ipAddress + lastString);
return;
}else {
return;
}
}else {
return;
}
}
String[] nextString = new String[3];
for (int i = 0; i < 3; i++) {
if(ipAddress.length() - n + i + 1 <= s.length()) {
nextString[i] = s.substring(ipAddress.length() - n, ipAddress.length() - n + i + 1);
if(nextString[i].length() != 1 && nextString[i].charAt(0) == '0') {
continue;
}
if(Integer.valueOf(nextString[i]) >= 0 && Integer.valueOf(nextString[i]) <= 255) {
generateIpAddresses(ipAddress + nextString[i] + ".", s);
}
}
}
return;
}
public static void main(String[] args) {
//["0.10.0.10","0.100.1.0"]
String string = "010010";
System.out.println(new Solution().restoreIpAddresses(string));
}
}
复杂度分析:
时间复杂度:O(2 ^ 3)
空间复杂度:O(1)