LeetCode093——复原IP地址

版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/81603416

原题链接: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)

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/81603416