Algorithms, Blockchain and Cloud

Teaching Kids Programming – Back-tracking Depth First Search Algorithm to Restore IP Addresses


Teaching Kids Programming: Videos on Data Structures and Algorithms

A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros.

For example, “0.1.2.201” and “192.168.1.1” are valid IP addresses, but “0.011.255.245”, “192.168.1.312” and “192.168@1.1” are invalid IP addresses.
Given a string s containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s. You are not allowed to reorder or remove any digits in s. You may return the valid IP addresses in any order.

Example 1:
Input: s = “25525511135”
Output: [“255.255.11.135″,”255.255.111.35”]

Example 2:
Input: s = “0000”
Output: [“0.0.0.0”]

Example 3:
Input: s = “101023”
Output: [“1.0.10.23″,”1.0.102.3″,”10.1.0.23″,”10.10.2.3″,”101.0.2.3”]

Constraints:
1 <= s.length <= 20
s consists of digits only.

Back-tracking Depth First Search Algorithm to Restore IP Addresses

If the string is less than 4 digits or more than 12 digits, it is impossible to restore any valid IP addresses. We can backtrack (Depth First Search with branches cut-off). The DFS can usually be implemented via Recursion.

We start by an empty list, then trying possible digits forming a next number. Each number has at most 3 digits, and can’t have leading zeros unless it is a single zero. Also, when there are four numbers, we have to check if all digits are used.

After we invoke the Recursive call, we have to restore the parameter i.e. the current list of IP numbers.

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:        
        ans = []
        if len(s) > 12 or len(s) < 4:
            return ans
        
        def dfs(cur):
            n = sum(len(str(x)) for x in cur)
            if len(cur) == 4:
                if n == len(s):
                    ans.append(".".join(cur))
                return            
            for i in range(n, min(n + 3, len(s))):
                x = s[n:i+1]
                if 0 <= int(x) <= 255 and (x == '0' or (len(x) > 0 and x[0] != '0')):
                    cur.append(x)
                    dfs(cur)
                    cur.pop()        
        dfs([])
        return ans

–EOF (The Ultimate Computing & Technology Blog) —

447 words
Last Post: Teaching Kids Programming - Compute the Number of Consecutive Ones Less than K using Top Down Dynamic Programming Algorithm (Recursion + Memoziation)
Next Post: Teaching Kids Programming - Find the Difference of Two Arrays (via Hash Set)

The Permanent URL is: Teaching Kids Programming – Back-tracking Depth First Search Algorithm to Restore IP Addresses (AMP Version)

Exit mobile version