给定一个字符串只含有数字,判定这个字符串能表达的所有IP地址

217 篇文章 0 订阅
174 篇文章 2 订阅

本题源自LeetCode

-------------------------------------------------------------------

用三重循环遍历字符串,每个段的长度不能超过三,

java代码:

   public ArrayList<String> restoreIpAddresses(String s) {
        ArrayList<String> result=new ArrayList<String>();
        int len=s.length();
        
        for(int i=1;i<4&&i<len-2;i++){
            for(int j=i+1;j<i+4&&j<len-1;j++){
                for(int k=j+1;k<j+4&&k<len;k++){
                    if(len-k>=4)      //判断字符串 是否有剩余
                        continue;
                    int a=Integer.parseInt(s.substring(0,i));
                    int b=Integer.parseInt(s.substring(i,j));
                    int c=Integer.parseInt(s.substring(j,k));
                    int d=Integer.parseInt(s.substring(k));
                    
                    if(a>255||b>255||c>255||d>255)
                        continue;
                    String ip=a+"."+b+"."+c+"."+d;
                    if(ip.length()<len+3)
                        continue;
                    result.add(ip);
                }
            }
        }
        return result;
    }

C++代码 :

    vector<string> restoreIpAddresses(string s) {
        vector<string> result;
        string t;                           //存每次子串的结果
        DFS(t,s,result,0);
        return result;
    }
    void DFS(string t,string s,vector<string>& result,int count){
        if(count==3&&isValid(s)){
            result.push_back(t+s);
            return;
        }
        for(int i=1;i<4&&i<s.size();i++){
            string sub=s.substr(0,i);   //取子串
            if(isValid(sub)){
                DFS(t+sub+".",s.substr(i),result,count+1);
            }
        }
    }
    bool isValid(string s){
        stringstream ss;
        int num;
        ss<<s;
        ss>>num;
        if(s.size()>1){   //如果数字长度大于1 ,则首位不能是0;
            return s[0]!='0'&&num>=0&&num<256;
        }
        return num>=0&&num,256;
    }


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值