Program to generate all possible valid IP addresses from given string

Given a string containing only digits, restore it by returning all possible valid IP address combinations.

A valid IP address must be in the form of A.B.C.D, where A, B, C, and D are numbers from 0-255. The numbers cannot be 0 prefixed unless they are 0.

Examples :

Input : 25525511135
Output : [“255.255.11.135”, “255.255.111.35”]
Explanation: 
These are the only valid possible
IP addresses.

Input : "25505011535"
Output : []
Explanation : 
We cannot generate a valid IP
address with this string. 

First, we will place 3 dots in the given string and then Try out all the possible combinations for the 3 dots.
Corner case for validity :

For string "25011255255"

25.011.255.255 is not valid as 011 is not valid.
25.11.255.255 is not valid either as you are not
                   allowed to change the string.
250.11.255.255 is valid.



Approach :
Split the string with ‘ . ‘ and then check for all corner cases. Before entering the loop, check the size of string. Generate all the possible combinations using looping through the string. If IP is found to be valid then return the IP address, else simply return empty list.
 
Below is the implementation of above approach :

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to generate all possible
// valid IP addresses from given string
import java.util.*;
  
class GFG {
      
    // Function to restore Ip Addresses
    public static ArrayList<String> restoreIpAddresses(String A) 
    {
        if (A.length() < 3 || A.length() > 12)
            return new ArrayList<>();
        return convert(A);
    }
  
    private static ArrayList<String> convert(String s) 
    {
        ArrayList<String> l = 
                  new ArrayList<>();
        int size = s.length();
  
        String snew = s;
  
        for (int i = 1; i < size - 2
                               i++)
        {
            for (int j = i + 1
                 j < size - 1; j++) 
            {
                for (int k = j + 1
                     k < size; k++) 
                {
                    snew = snew.substring(0, k) +
                           "." + snew.substring(k);
                    snew = snew.substring(0, j) + 
                           "." + snew.substring(j);
                    snew = snew.substring(0, i) + 
                           "." + snew.substring(i); 
                             
                    if (isValid(snew))
                    {
                        l.add(snew);
                    }
                    snew = s;
                }
            }
        }
  
        Collections.sort(l, new Comparator<String>() 
        {
            public int compare(String o1, String o2)
            {
                String a1[] = o1.split("[.]");
                String a2[] = o2.split("[.]");
  
                int result = -1;
                for (int i = 0; i < 4 && 
                     result != 0; i++) 
                {
                    result = a1[i].compareTo(a2[i]);
                }
                return result;
            }
        });
        return l;
  
    }
  
    private static boolean isValid(String ip) 
    {
        String a[] = ip.split("[.]");
        for (String s : a) {
            int i = Integer.parseInt(s);
            if (s.length() > 3 || i < 0 || i > 255
            {
                return false;
            }
            if (s.length() > 1 && i == 0)
                return false;
            if (s.length() > 1 && i != 0 &&
                        s.charAt(0) == '0')
                return false;
        }
  
        return true;
    }
  
// Driver Code
public static void main(String[] args) 
{
    System.out.println(restoreIpAddresses
              ("25525511135").toString());
}
}
  
// This code is contributed by Nidhi Hooda.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python code to check valid possible IP
  
# Function checks wheather IP digits
# are valid or not.
def is_valid(ip):
  
    # Spliting by "."
    ip = ip.split(".")
      
    # Checking for the corner cases
    for i in ip:
        if len(i) > 3 or int(i) < 0 or int(i) > 255:
            return False
        if len(i) > 1 and int(i) == 0:
            return False
        if len(i) > 1 and int(i) != 0 and i[0] == '0':
            return False
    return True
  
# Function converts string to IP address
def convert(s):
    sz = len(s)
  
    # Check for string size
    if sz > 12:
        return []
    snew = s
    l = []
-
    # Generating different combinations.
    for i in range(1, sz - 2):
        for j in range(i + 1, sz - 1):
            for k in range(j + 1, sz):
                snew = snew[:k] + "." + snew[k:]
                snew = snew[:j] + "." + snew[j:]
                snew = snew[:i] + "." + snew[i:]
                  
                # Check for the validity of combination
                if is_valid(snew):
                    l.append(snew)
                snew = s
    return
  
# Driver code         
A = "25525511135"
B = "25505011535"
print(convert(A))
print(convert(B))

chevron_right



Output :

['255.255.11.135', '255.255.111.35']


My Personal Notes arrow_drop_up


If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : nidhi hooda