Generating the valid IP addresses from a String is a classic interview question. It is done using back tracking and a utility method that test is the current subString is a valid digit.
The main method loops on the characters of the input String. If the subString is a valid character, it remembers it and calls itself searching for n-1 characters. If at any point no characters are available or the sub String is not a valid digit, then the process stops.
import java.util.ArrayList;
import java.util.List;
public class InterviewValidIP {
public ArrayList<String> restoreIpAddresses(String A) {
ArrayList<String> toReturn = new ArrayList<String>();
if( A == null )
return toReturn;
process(toReturn, "", A, 4);
return toReturn;
}
public void process(ArrayList<String> toReturn, String tmpIP,
String in, int remaining){
if( remaining == 0 && in.length() == 0 ) {
toReturn.add( tmpIP );
return;
}
for( int i = 1 ; i <= in.length() ; i++ ){
String tmp = in.substring(0, i);
if( !isValidDigit(tmp) ){
return;
}
StringBuilder updatedIP = new StringBuilder();
updatedIP.append( tmpIP );
if ( tmpIP.length() != 0 )
updatedIP.append( "." );
updatedIP.append( tmp );
String remainder = in.substring( i, in.length() );
int lessOne = remaining - 1;
process( toReturn, updatedIP.toString(), remainder, lessOne);
}
}
public boolean isValidDigit(String in){
int i = -1;
try { i = Integer.parseInt( in ); }catch(Exception e){}
if( i == -1 )
return false;
if( i != 0 && in.charAt(0) == '0' )
return false;
if( i == 0 && in.charAt(0) == '0' && in.length() != 1 )
return false;
return i >= 0 && i <= 255;
}
public static void main(String[] argv) throws Exception {
InterviewValidIP t = new InterviewValidIP();
List<String> out = t.restoreIpAddresses( "0100100" );
for(String c : out){
System.out.println( "found=" + c );
}
}
}
found=0.10.0.100 found=0.100.10.0
The utility method is called isValidDigit, it validate that the number is a valid integer that is positive and less that 256. It also check that the number doesn't start with 0 if it's not 0.