题目
思路
首先写一个判断是否有效的方法,然后用回溯来进行每个点的添加,可是感觉这样时间复杂度好高啊。
代码
static final int SEG_COUNT = 4 ;
List < String > ans = new ArrayList < String > ( ) ;
int [ ] segments = new int [ SEG_COUNT] ;
public List < String > restoreIpAddresses ( String s) {
segments = new int [ SEG_COUNT] ;
dfs ( s, 0 , 0 ) ;
return ans;
}
public void dfs ( String s, int segId, int segStart) {
if ( segId== SEG_COUNT) {
if ( segStart== s. length ( ) ) {
StringBuilder sb = new StringBuilder ( ) ;
for ( int i= 0 ; i< segments. length; i++ ) {
if ( i== SEG_COUNT- 1 ) sb. append ( String . valueOf ( segments[ i] ) ) ;
else sb. append ( String . valueOf ( segments[ i] ) + '.' ) ;
}
ans. add ( sb. toString ( ) ) ;
}
return ;
}
if ( segStart == s. length ( ) ) return ;
if ( s. charAt ( segStart) == '0' ) {
segments[ segId] = 0 ;
dfs ( s, segId+ 1 , segStart+ 1 ) ;
}
int addr= 0 ;
for ( int i= segStart; i< s. length ( ) ; i++ ) {
addr = addr * 10 + ( s. charAt ( i) - '0' ) ;
if ( addr > 0 && addr <= 255 ) {
segments[ segId] = addr;
dfs ( s, segId + 1 , i + 1 ) ;
} else {
break ;
}
}
}