【每日一题】【回溯】2021年12月29日-93. 复原 IP 地址
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你不能重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/restore-ip-addresses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
回溯
class Solution { /** 回溯:结束条件(点的个数)、做选择(点的个数和字符串)、回溯/递归、移除选择 */ private List<String> res = new ArrayList<>(); public List<String> restoreIpAddresses(String s) { if(s.length() > 12) { return res; } backTracking(s, 0 , 0); return res; } public void backTracking(String s, int startIndex, int pointNum) { //结束条件 if(pointNum == 3) { if(isValid(s, startIndex, s.length() - 1)) { res.add(s); } return; } //循环 for(int i = startIndex; i < s.length(); i++) { if(isValid(s, startIndex, i)) { //做选择 pointNum++; s = s.substring(0, i + 1) + "." + s.substring(i + 1); //回溯/递归,注意起始位置是从下个数开始,隔过当前数和.符号 backTracking(s, i + 2, pointNum); //移除选择 pointNum--; s = s.substring(0, i + 1) + s.substring(i + 2); } else { break; } } } /** 判断所包含的数字是否有效 */ public boolean isValid(String s, int start, int end) { if(start > end) { return false; } if(s.charAt(start) == '0' && start != end) { return false; } int num = 0; for(int i = start; i <= end; i++) { if(s.charAt(i) > '9' || s.charAt(i) < 0) { return false; } //注意:字符转数字,要-0的ASCII码 num = num * 10 + (s.charAt(i) - '0'); if(num > 255) { return false; } } return true; } }
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15746558.html