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
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~