数字字符串转化为IP地址 Apare

2 篇文章 1 订阅
0 篇文章 0 订阅

数字字符串转化为IP地址

牛客链接 <–

题目描述

现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525511135",
返回[“255.255.11.135”, “255.255.111.35”]. (顺序没有关系)

输入:
“25525511135”

输出
[“255.255.11.135”,“255.255.111.35”]

函数接口规定:

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串vector
     */
    vector<string> restoreIpAddresses(string s) {
    	//write your code here
    }
};

这个题目之前面试的时候遇到过,还是要考虑一些情况的。首先要dfs,把字符串分隔成4部分,因为IPv4是32位的,用点分十进制分成a.b.c.d的形式,每个十进制数都要在[0,255]的范围内。所以我们dfs的时候,可以先保证每个数的位数在1到3之间。
dfs出分割后,要判断这个十进制数是否合法。如果是空串一定不行,如果有前导零也不行,大于255也不行。

class Solution {
public:
    /**
     * 
     * @param s string字符串 
     * @return string字符串vector
     */
    string tmp;
    int r[4];
    int ok(string s) { //判断十进制串是否合法
    	if(!s.length()) return -1; //空串
    	if((int)s.length()>1 && s[0]=='0') return -1; //有前导零
    	int ans = 0;
    	for(int i=0;i<(int)s.length();++i) {
    		ans = ans * 10 + s[i]-'0';
		}
		if(ans>255) ans = -1; 
		return ans;
	} 
    string judge() { //判断这种分隔方案是否可行
        string a = tmp.substr(0,r[1]+1);
        string b = tmp.substr(r[1]+1,r[2]-r[1]);
        string c = tmp.substr(r[2]+1,r[3]-r[2]);
        string d = tmp.substr(r[3]+1);
       	string res = "#";
        if(ok(a)!=-1 && ok(b)!=-1 && ok(c)!=-1 && ok(d)!= -1) {
			res = a+"."+b+"."+c+"."+d; 
		}
		return res; 
    }
    void dfs(int x,vector<string>& vans) {
        if(x==4) {
            string res = judge();
            if(res!=string("#")) vans.push_back(res);
            return;
        }
        for(int i=1;i<=3;++i) {
        	if(r[x-1]+i>=(int)tmp.length()) return; //后面的串分配不到字符了
            r[x] = r[x-1]+i;
            dfs(x+1,vans);
        }
    }
    vector<string> restoreIpAddresses(string s) {
        tmp = s;
        vector<string> ans;
        r[0] = -1;
        dfs(1,ans);
        return ans;
    }
};

用r[]记录每个字符串最后一个元素在原串中的下标。然后对于dfs出的每个方案,判断四个子串的合法性,若合法,就记录。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值