一【题目类别】
二【题目难度】
三【题目编号】
四【题目描述】
给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
五【题目示例】
示例 1: 输入:s = “25525511135” 输出:[“255.255.11.135”,“255.255.111.35”] 示例 2: 输入:s = “0000” 输出:[“0.0.0.0”] 示例 3: 输入:s = “1111” 输出:[“1.1.1.1”] 示例 4: 输入:s = “010010” 输出:[“0.10.0.10”,“0.100.1.0”] 示例 5: 输入:s = “101023” 输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]
六【题目提示】
0 <= s.length <= 3000 s 仅由数字组成
七【解题思路】
每次递归判断是否找到了一组,如果找到了一组,再判断是否全部使用,如果全部数字都使用了,加入即可,如果还有剩余数字没有使用,剪枝回溯 因为每位最少一个数字,最多三个数字,所以从1到3截取,也就是每组多少个数字,当前要判断截取的数字是否可用,还要判断截取是否越位 截取到一个合理的加入到数组中,开始递归下一位 最后剪枝回溯
八【时间频度】
时间复杂度:时间复杂度由递归树的层数决定,一般是常数级别
O
(
N
)
O(N)
O ( N )
九【代码实现】
Java语言版
package String;
import java. util. ArrayList;
import java. util. List;
public class p93_RestoreIpAddresses {
public static void main ( String[ ] args) {
String s = "25525511135" ;
List< String> res = restoreIpAddresses ( s) ;
System. out. println ( "res = " + res) ;
}
public static List< String> restoreIpAddresses ( String s) {
List< String> res = new ArrayList < > ( ) ;
if ( s == null || s. length ( ) == 0 ) {
return res;
}
backTrack ( s, 0 , new ArrayList < > ( ) , res) ;
return res;
}
public static void backTrack ( String s, int pos, List< String> cur, List< String> res) {
if ( cur. size ( ) == 4 ) {
if ( pos == s. length ( ) ) {
res. add ( String. join ( "." , cur) ) ;
}
return ;
}
for ( int i = 1 ; i <= 3 ; i++ ) {
if ( pos + i > s. length ( ) ) {
break ;
}
String segment = s. substring ( pos, pos + i) ;
if ( segment. startsWith ( "0" ) && segment. length ( ) > 1 || ( i == 3 ) && Integer. parseInt ( segment) > 255 ) {
continue ;
}
cur. add ( segment) ;
backTrack ( s, pos + i, cur, res) ;
cur. remove ( cur. size ( ) - 1 ) ;
}
}
}
C语言版
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define MAX_SIZE 1024
bool isValid ( char * s, int len)
{
if ( s == '\0' )
{
return false;
}
if ( s[ 0 ] == '0' && len > 1 )
{
return false;
}
int num = 0 ;
for ( int i = 0 ; i < len; i++ )
{
num = num * 10 + s[ i] - '0' ;
}
if ( num >= 0 && num <= 255 )
{
return true;
}
return false;
}
void dfs ( char * s, char * * res, int * returnSize, char * str, int idx, int validNum)
{
if ( validNum > 4 )
{
return ;
}
if ( s[ 0 ] == '\0' && validNum == 4 )
{
res[ * returnSize] = ( char * ) malloc ( strlen ( str) + 1 ) ;
strcpy ( res[ * returnSize] , str) ;
( * returnSize) ++ ;
}
if ( validNum > 0 && validNum < 4 )
{
str[ idx++ ] = '.' ;
}
for ( int len = 1 ; len <= 3 && len <= strlen ( s) ; len++ )
{
if ( isValid ( s, len) )
{
for ( int i = 0 ; i < len; i++ )
{
str[ idx + 1 ] = s[ i] ;
}
dfs ( s + len, res, returnSize, str, idx + len, validNum + 1 ) ;
}
}
}
char * * restoreIpAddresses ( char * s, int * returnSize)
{
char * * res = ( char * * ) malloc ( MAX_SIZE * sizeof ( char * ) ) ;
* returnSize = 0 ;
char * str = ( char * ) calloc ( strlen ( s) + 4 , sizeof ( char ) ) ;
dfs ( s, res, returnSize, str, 0 , 0 ) ;
return res;
}
十【提交结果】
Java语言版 C语言版