LeetCode093——复原IP地址

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/restore-ip-addresses/description/

题目描述:

知识点:递归,回溯

思路:回溯法穷举所有可能的IP地址格式

(1)在题给的Solution类里新建一个私有的List类型的成员变量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。

时间复杂度是O(n ^ 3),其中n为字符串s中的字符数。空间复杂度即递归深度O(n)。

JAVA代码:

public class Solution {

	private List res;

	public List 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;
	}
}

LeetCode解题报告

LeetCode093——复原IP地址_第1张图片

 

你可能感兴趣的:(LeetCode题解)