纯数字字符串转ip地址

leetcode 93. Restore IP Addresses

一、问题描述

        给定一个只包含数字的字符串,通过返回所有可能的有效IP地址组合来恢复它。
        【举例】
        输入: "25525511135"

        输出: ["255.255.11.135", "255.255.111.35"]

二、解题思路

        从头到尾遍历所有可能的ip组合,将组合的ip先暂存到中间数组中---使用深度优先,及时将不符合的组合剪枝,再将合法的ip组合放入最终结果数组。

三、算法代码

/*******************************************************
Author:tmw
date:2018-5-14
********************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
参数:
*s    : 源数字字符串
*ip   :存储临时转的地址
start :有效ip地址分4段,start为每一段的起始下标
step  :记录已分出的ip地址段数
**result :转换成有效ip地址的所有可能情况
**/

/**将ch字符串追加到str末尾**/
char* add_one_ch( char* str, char ch )
{
    int len = strlen(str);
    str[len] = ch;
    str[len+1] = '\0';
    return str;
}
int count = 0;/**记录找到有效ip的个数**/
void Str_2_Ip_dfs( char* s, char* ip, int start, int step, char** result )
{
    /**当start下标到达s最后一个字符的下一位,说明此种情况下的有效ip地址转换完毕**/
    if( start == strlen(s) && step == 4 )
    {
        ip[strlen(ip)-1] = '\0';
        strcpy(result[count],ip);
        count++;

        return;
    }

    /**剪枝语句**/
    /**当前组合情况如果导致后面的元素偏多,则及时返回**/
    if( strlen(s)-start > (4-step)*3 ) return;

    /**当前组合情况如果导致后面的元素个数不足以最终转换成xxx.xxx.xxx.xxx,则及时返回**/
    if( strlen(s)-start < (4-step) )  return;

    int i;
    int sum = 0;
    /**ip地址最多是百位数字**/
    for( i=start; i<start+3; i++ )
    {
        sum = sum*10 + (s[i]-'0');

        /**对所有可能进行dfs**/
        if( sum <= 255 )
        {
            /**将当前可能的组合情况存入ip空间中**/
            add_one_ch(ip,s[i]);
            int mark_len = strlen(ip);/**记dfs前的状态**/
            Str_2_Ip_dfs(s,add_one_ch(ip,'.'),i+1,step+1,result);
            ip[mark_len]='\0'; /**状态恢复**/
        }

        /**ip地址前缀不能为0,0可以单独成一段,上一个if的前面则0就认为不能成一段**/
        if( sum == 0 ) break;
    }

}

/**
*s         :源数字字符串
*returnSize:用于返回找到的有效ip的个数
**/
char** restoreIpAddresses(char* s, int* returnSize)
{
    /**为临时结果ip和最终结果result申请空间,给临时存储空间初始化**/
    char* ip = (char*)malloc(20*sizeof(char));
    memset(ip,0,strlen(ip));

    char** result = (char**)malloc(1000*sizeof(char*));
    int i;
    count = 0;

    for( i=0; i<1000; i++ )
        result[i] = (char*)malloc(20*sizeof(char));

    Str_2_Ip_dfs( s,ip,0,0,result );
    *returnSize = count;
    return result;
}

四、执行结果

leetcode accept


梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~


好的,我可以帮您写出这样一个函数: ```c++ bool is_valid_IP(const char* ip_address) { if (!ip_address) return false; // 空指针不是有效IP地址 int len = strlen(ip_address); if (len < 7 || len > 15) return false; // IP地址的长度应该在7~15个字符之间 char buffer[16]; // 存放每个数字的缓冲区 int num = 0; // 当前处理的数字 int dots = 0; // 已经处理的小数点数量 for (int i = 0; i < len; i++) { char c = ip_address[i]; if (c == '.') { if (num < 0 || num > 255) return false; // 数字不在0~255范围内,不是有效IP地址 num = 0; // 处理下一个数字 dots++; // 处理下一个小数点 } else if (c >= '0' && c <= '9') { num = num * 10 + (c - '0'); // 计算当前数字的值 } else { return false; // 非数字和小数点的字符不是有效IP地址 } if (dots > 3) return false; // IP地址中小数点的数量应该是3个 } if (dots != 3 || num < 0 || num > 255) return false; // 最后一个数字的处理 return true; // 满足所有条件,是有效IP地址 } ``` 这个函数首先检查给定字符串是否为NULL,如果是,直接返回false。然后检查字符串的长度,如果不在7~15个字符之间,也返回false,因为IP地址最长只有15个字符(例如:255.255.255.255),最短只有7个字符(例如:0.0.0.0)。 接下来,函数使用一个循环来遍历字符串中的每个字符。如果遇到小数点,就将当前处理的数字的值存储到一个缓冲区中,并检查它是否在0~255之间。如果当前字符是数字,就将它的值加到当前数字的末尾。如果遇到其他字符,就说明这个字符串不符合IP地址的格式,直接返回false。 循环结束后,函数还需要检查最后一个数字的值是否在0~255之间,以及小数点的数量是否为3个。如果都满足,就说明这个字符串有效IP地址返回true,否则返回false。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值