算法训练: Restore IP Addresses

来源:互联网 发布:sql新增字段语句 编辑:程序博客网 时间:2024/04/29 13:26

题目链接:https://leetcode.com/problems/restore-ip-addresses/?tab=Description

题目描述:

       给一个只包含数字的字符串,要求返回所有合法的IP地址。

       例: 给定字符串为 "25525511135" ,需要返回["255.255.11.135", "255.255.111.35"](顺序无关)

解题思路:

      采用一种深度优先遍历的思想,得到所有的组合。

      对于给定的字符串,每次取字符的一个、两个或者三个字符串,f转换成整型(“255”变为255),判断该整型值是否在小于256,

若是,对剩下的字符串采用同样的方法进行遍历,直到遍历到字符串的最后并且符合合法IP地址的形式,则返回,如果该整型值大

于256,则跳过该种情况。

       legalIP的参数:s表示输入的字符串,startindex表示每段遍历的起始地址,step合法IP地址遍历次数,等于4则表示遍历结束,

currenip表示当前遍历时IP地址,res为保存合法IP地址的数组。

void legalIP(string s, int startindex, int step, string currentip, vector<string>&res){        int len=s.size();        int sum=0;        //判断字符串的长度是否合法        if((len-startindex)>(12-step*3)) return;        if((len-startindex)<(4-step)) return;        //判断字符串的长度合法,且遍历到了最后,得到一个合法IP地址        if(len==startindex&&step==4){            res.push_back(currentip);            return;        }        //以三个字符为一组,如果小于256,则参与递归        for(int i=startindex; i<startindex+3 && i<len; i++){           sum=sum*10+s[i]-'0';           if(sum<=255){               currentip=currentip+s[i];               if(i<len-1) legalIP(s, i+1, step+1, currentip+'.',res);               else legalIP(s, i+1, step+1, currentip,res);//遍历到最后,不加'.'           }           else return;//大于255即结束遍历返回           if(sum==0) return;//避免前缀为0       }             }    vector<string> restoreIpAddresses(string s) {        vector<string> result;        string currentip;        legalIP(s,0,0,currentip,result);        return result;    }

结果:     

Your Input
"322000"
Your answer
["3.2.200.0","3.220.0.0","32.20.0.0"]
Expected answer
["3.2.200.0","3.220.0.0","32.20.0.0"]



   










0 0
原创粉丝点击