[C++]LeetCode: 40 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)

思路:IP地址可以需要划分为四部分,并且每部分数字范围是0~255. 可以采取递归的方式得到合法的IP地址。注意需要每次判别每一个小部分数字是否合法, 如果是合法的数字,我们再进行下一层递归,否则跳过. 构造两个辅助函数。

新函数:

stoi : 将字符串转换为数字; 

int stoi (const string&  str, size_t* idx = 0, int base = 10);
int stoi (const wstring& str, size_t* idx = 0, int base = 10);

atoi:     字符数组转int 

int atoi (const char * str);

Attention: 

1. 在验证字符串是否是数字的时候,要注意0的情况,001,010,03都是非法的。所以,如果第一位取出来是0,那么我们就判断字符串是否是"0",不是的情况都是非法的

2. 取字符串的时候,注意位数不够的问题,不仅<4, 而且

3. 注意substring的范围

4. 字符串转换成数字 stoi; 

5. 别忘了IP 地址里面的 "."

6. 到第4个Part的时候我们就可以整体验证剩下的所有字符串(因为第4个Part最后一定要取到结尾才是正确的字符串)

7.注意当切割到最后一个部分时,添加ip字符串的方式不一样,不需要“.”


AC Code:

class Solution {
public:
    vector restoreIpAddresses(string s) {
        //采用递归 + 判断有效性 增加两个函数
        
        vector ret;
        if(s.length() < 4 || s.length() > 12) return ret;
        int strlen = s.length();
        restoreIpAddresses_helper(s, "", ret, 1);
        return ret;
    }
    
private:
    void restoreIpAddresses_helper(string s, string tmp, vector& ret, int segment){
        //s代表字符串剩余未切割的数字,tmp代表目前已分割好的IP, segment代表当前分割到IP第几个部分
        
        //如果分割了四个部分数字,结束本次查询递归。
        if(segment == 4 && isValid(s))
        {
             ret.push_back(tmp + s);
             return;
        }
        
        for(int i = 1; i < 4 && (i < s.length()); i++)
        {
            string substr = s.substr(0, i);
            if(isValid(substr))
            {
                int strlen = s.length();
                restoreIpAddresses_helper(s.substr(i, strlen - i), tmp + substr + '.' , ret, segment + 1);
            }
            
        }
    }
    
    bool isValid(string str){
        //注意:数据太大会领导i溢出,所以别忘记加判断s.length()>3  
        if(str.length() == 0 || str.length() > 3) return false;
        //注意:01,02,033等情况,但是0是合法的  
        if(str[0] == '0' && str.length() > 1) return false;
        
        //因为stoi只能是转换成为int大小,超过INT_MIN INT_MAX就会溢出  
        int num = std::stoi(str);
        if(num >= 0 && num <= 255)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
};



你可能感兴趣的:(LeetCode,Backtracking,string,leetcode)