• [leetcode] Restore IP Addresses


    这个题目就和Palindrome Partitioning很像了,而且比那个的DFS的递归要简单一些,让常人更好理解一些。但是边界条件更多,要考虑清楚。

    整体思路就是深度优先搜索,首先看到边界条件没,如果没有,就深度搜索:

    一开始搜索1个字符和剩下的字符串,判断该字符的index是否越界了,对于剩下的字符串递归;

    然后是2个字符和剩下的字符串,判断这2个字符的首字符是否是0,对于剩下的字符串递归;

    然后是3个字符和剩下的字符串,判断这3个字符的首字符是否是0,并且这3个字符组成的数字是否小于等于255,对于剩下的字符串递归。

    ok,思路理清楚了,上代码:

    import java.util.ArrayList;
    
    public class Solution {
        ArrayList<String> rt = new ArrayList<String>();
        ArrayList<Integer> cand = new ArrayList<Integer>();
        String str;
        
        public ArrayList<String> restoreIpAddresses(String s) {
            // Start typing your Java solution below
            // DO NOT write main() function
            rt.clear();
            cand.clear();
            str = s;
            
            if (s.length() > 12)
                return rt;
            
            dfs(0);
            return rt;
        }
        
        //index 是当前检测的第一个字符
        private void dfs(int index) {
            //终止条件,已经检测到合法的candidate,那么添加到结果集
            if (cand.size() == 4 && index == str.length()) {
                addCandToRt();
            }
            
            //因为1位和2位数字肯定小于255,所以直接往更深搜索
            if (index >= str.length() || cand.size() >= 4)
                return;
            cand.add(Integer.parseInt(str.substring(index, index+1)));
            dfs(index+1);
            cand.remove(cand.size()-1);
            
            if (index >= str.length()-1 || str.substring(index, index+1).equals("0") || cand.size() >= 4)
                return;
            cand.add(Integer.parseInt(str.substring(index, index+2)));
            dfs(index+2);
            cand.remove(cand.size()-1);
            
            if (index >= str.length()-2 || str.substring(index, index+1).equals("0") || cand.size() >= 4)
                return;
            if (Integer.parseInt(str.substring(index, index+3)) <= 255) {
                cand.add(Integer.parseInt(str.substring(index, index+3)));
                dfs(index+3);
                cand.remove(cand.size()-1);
            }
        }
        
        private void addCandToRt() {
            String ip = cand.get(0) + "."
                    + cand.get(1) + "."
                    + cand.get(2) + "."
                    + cand.get(3);
            rt.add(ip);
        }
        
        public static void main(String[] args) {
            String s = "010010";
            Solution sl = new Solution();
            ArrayList<String> all = sl.restoreIpAddresses(s);
            for (int i = 0; i < all.size(); i++) {
                System.out.println(all.get(i));
            }
        }
    }

    我对这个题目的理解是,一个完整的DFS,加上数个条件的剪枝。

    回头看看有没有别的办法解这道题目。

  • 相关阅读:
    什么是级联
    @GeneratedValue
    Spring Data JPA中CrudRepository与JpaRepository的不同
    Spring Data JPA的方法命名规则
    C/S架构的渗透测试-请求加解密及测试
    各类Fuzz字典
    Nessus8.11破解
    xss实验1-20writeup
    IIS短文件名漏洞
    Linux挂载exfat文件系统的U盘
  • 原文地址:https://www.cnblogs.com/lihaozy/p/3182696.html
Copyright © 2020-2023  润新知