📣 独立日限时特惠: VIP通行证立减$68
查看: 2127| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 对于递归的迷惑

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
求助各位编程大牛, 我做leetcode的题“Restore IP addresseshttp://oj.leetcode.com/problems/restore-ip-addresses/, 对于递归的应用非常迷茫, 求助。
一下为我尝试理解的答案。
package algorithm.sort;

public class RestoreIPAddress {

        /**
         *  
         * Restore IP Addresses
         *  
         *  
         * Given a string containing only digits, restore it by returning all possible valid IP address combinations.
         
        For example:
        Given "25525511135",
         
        return ["255.255.11.135", "255.255.111.35"]. (Order does not matter)
         *
         */  
       
          
            public static void main(String args[]) {  
                System.out.println(restoreIpAddresses("25525511135"));  
            }  
          
            public static ArrayList<String> restoreIpAddresses(String s) {  
                ArrayList<String> al = new ArrayList<String>();  
                if(s.length() > 12){     // 及时过滤  
                    return al;  
                }  
                StringBuilder sb = new StringBuilder();  
                dfs(s, al, sb, 0);  
                return al;  
            }  
             
            public static boolean isValid(String s){  
                if(s.length()==0 || s.length()>3){  
                    return false;  
                }  
                int val = Integer.parseInt(s);  
                if(!String.valueOf(val).equals(s)){     // 防止解析成00.01.010.0类似的情况  
                    return false;  
                }  
                if(val<0 || val>255){  
                    return false;  
                }  
                return true;  
            }  
             
            public static void dfs(String s, ArrayList<String> al, StringBuilder sb, int level){  
                if(level == 3){     // 第3次特别判断,必须取剩下的全部字符串  
                    if(isValid(s)){  
                        sb.append(s);  
                        al.add(sb.toString());      // 最后一次不加.  
                        sb.delete(sb.length()-s.length(), sb.length()); // 撤销动作  
                        return;  
                    }  
                }  
                  
                for(int i=0; i<s.length()-1; i++){  
                    String substr = s.substring(0, i+1);  
                    if(isValid(substr)){  
                        sb.append(substr).append(".");      // 执行动作  
                        dfs(s.substring(i+1), al, sb, level+1);      
                        sb.delete(sb.length()-1-substr.length(), sb.length());  // 撤销动作  
                    }  
                }  
            }  
        }  

上一篇:关于A*算法和dijskra算法
下一篇:Merge sort list, runtime error,哪里错了呢
🔗
Linzertorte 2014-4-4 13:16:08 | 只看该作者
全局:
你这个代码太长了。不利于你理解算法的本质。
不知道楼主会不会python
我这题用python做过。
https://github.com/Linzertorte/L ... storeIPAddresses.py
回复

使用道具 举报

🔗
 楼主| 我要当码农 2014-4-8 13:33:34 | 只看该作者
全局:
Linzertorte 发表于 2014-4-4 13:16
你这个代码太长了。不利于你理解算法的本质。
不知道楼主会不会python
我这题用python做过。

万分感谢,我研究研究, 感谢感谢
回复

使用道具 举报

🔗
xyz110119120 2014-4-8 15:17:53 | 只看该作者
全局:
本帖最后由 xyz110119120 于 2014-4-8 15:22 编辑


没细看楼主的代码,我觉得至少最后一个循环,可以写成1-3的循环,而不是0到s.length()-1。

用笨方法写了个代码,如下:


复制代码

回复

使用道具 举报

🔗
xyz110119120 2014-4-8 15:34:26 | 只看该作者
全局:

搞了好几次,代码也没黏进去。可能改的次数太多了,上面那个帖子已经不能编辑了。代码如下:


public class Solution {
        public static void main(String args[]) {
               
                int[] len = new int[4];
               
                String ipStr = "25525511135";
               
                int lenIpStr = ipStr.length();
               
                for (len[0]=1; len[0]<=3; len[0]++) {
                        for (len[1]=1; len[1]<=3; len[1]++) {
                                for (len[2]=1; len[2]<=3; len[2]++) {
                                        for (len[3]=1; len[3]<=3; len[3]++) {
                                                if (len[0] + len[1] + len[2] + len[3] == lenIpStr) {
                                                        int start = 0;
                                                        int end = 0;
                                                        int i;
                                                        String[] ip = new String[4];
                                                        for (i=0; i<4; i++) {
                                                                end += len[i];
                                                                ip[i] = ipStr.substring(start, end);
                                                                if (! isValid(ip[i])) {break;}
                                                                start = end;
                                                        }
                                                if (i==4) {
                                                        System.out.println("[" + ip[0] + "." + ip[1] + "." + ip[2] + "." + ip[3] + "]" );
                                                }
                                                }
                                        }
                                }
                        }
                }

        }
       
       
    public static boolean isValid(String s){  
        int val = Integer.parseInt(s);  
        if(!String.valueOf(val).equals(s)){     // 防止解析成00.01.010.0类似的情况  
            return false;  
        }  
        if(val<0 || val>255){  
            return false;  
        }  
        return true;  
    }  
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表