1108. Defanging an IP Address

EasyString
Leetcode Link

Problem Description

The problem requires writing a function that takes a standard IPv4 address as input and outputs a modified version of this IP address, called the "defanged" IP address. An IPv4 address is a string comprising four numbers separated by periods (e.g., "192.168.0.1"). The defanged version of this IP address is one where every period, ".", is replaced with "[.]" (e.g., "192[.]168[.]0[.]1"). This is usually done to prevent the IP address from being accidentally used in a context where it might represent an actionable hyperlink, such as in documentation or logs.

Intuition

The intuition behind the solution is straightforward. Since the task is to replace every period in the IP address with "[.]", Python's string method replace can be utilized. This inbuilt method takes two parameters: the substring we want to replace (".") and the substring we want to insert in place of it ("[.]"). By calling address.replace('.', '[.]'), we are telling the program to go through the entire string address and replace instances of '.' with '[.]'. This method scans the string from the beginning to the end while applying the replacement and builds the new defanged IP address string to be returned.

Solution Approach

The solution provided is simple and leverages Python's built-in string methods. Here is an explanation of the steps involved in the implementation of the solution provided:

  1. The defangIPaddr function takes in a parameter address, which is a string representing a valid IPv4 address.

  2. To 'defang' this IP address, the replace method of Python strings is called on address. The replace method is a common string operation that searches for occurrences of a specified substring within the string, and replaces each occurrence with another specified substring.

  3. In this instance, we are telling the replace method to search for the substring '.' (which represents the periods in the IP address) and replace each occurrence with the substring '[.]'.

  4. The replace method does not change the original string but returns a new string with all the replacements made, which is exactly what is required for this problem. This is because strings in Python are immutable, meaning they cannot be altered once created.

  5. The result is then returned as the output of the function. This single line of code: return address.replace('.', '[.]') is the complete implementation of the solution.

No external data structures, complex patterns, or algorithms are involved in this solution. It's a direct application of a string method to perform the required transformation.

Ready to land your dream job?

Unlock your dream job with a 2-minute evaluator for a personalized learning plan!

Start Evaluator

Example Walkthrough

Let's walk through a small example to illustrate the solution approach for defanging an IPv4 address.

Suppose we are given the following IP address as input:

"123.45.67.89"

Our goal is to take this IP and transform it into a "defanged" version. According to the problem description, defanging an IP means replacing every period "." with "[.]". We want to end up with:

"123[.]45[.]67[.]89"

Here's how we apply the solution approach:

  1. We call the function defangIPaddr, passing in our example IP address:

    defanged_ip = defangIPaddr("123.45.67.89")
  2. Within the defangIPaddr function, we use Python's replace method on the passed address:

    return address.replace('.', '[.]')
  3. The replace method searches for each instance of the period . in the string "123.45.67.89" and replaces it with "[.]".

  4. The replace method processes the string from start to finish and performs the replacement sequentially:

    • After encountering the first period, we get "123[.]45.67.89".
    • After the second period, it becomes "123[.]45[.]67.89".
    • Lastly, after the third period, we achieve the final result: "123[.]45[.]67[.]89".
  5. The new defanged IP address string "123[.]45[.]67[.]89" is then stored in defanged_ip.

  6. The function returns this new string, completing the operation.

By calling defangIPaddr with our example input, we have converted the standard IP address into its defanged format without altering the original string, using a very straightforward and efficient method.

Solution Implementation

1class Solution:
2    def defangIPaddr(self, address: str) -> str:
3        # Replace all instances of the '.' character with '[.]'
4        # This is used to 'defang' an IP address to prevent it from being
5        # instantly recognizable as an IP address and might help to prevent
6        # some simplistic automated systems from detecting it.
7        defanged_address = address.replace('.', '[.]')
8
9        # Return the modified IP address
10        return defanged_address
11
1class Solution {
2    // Function to defang an IPv4 address
3    public String defangIPaddr(String address) {
4        // Replace each period '.' in the address with '[.]'
5        String defangedAddress = address.replace(".", "[.]");
6      
7        // Return the defanged IP address
8        return defangedAddress;
9    }
10}
11
1class Solution {
2public:
3    // Function to convert a standard IP address into a defanged version
4    // where every period '.' is replaced with "[.]"
5    string defangIPaddr(string address) {
6        // Iterate through the string in reverse order using the index
7        for (int i = address.size() - 1; i >= 0; --i) { // Fixed the start index to size - 1
8            // Check if the current character is a period '.'
9            if (address[i] == '.') {
10                // Replace the period with "[.]" at the current index
11                address.replace(i, 1, "[.]"); // Use '1' for the length of the period to be replaced
12            }
13        }
14
15        // Return the modified address with defanged IP
16        return address;
17    }
18};
19
1// This function takes an IP address as a string and replaces every period ('.') with '[.]'
2// to 'defang' it, which is often done to prevent URLs or IPs from being automatically
3// hyperlinked or processed by text parsers.
4// @param {string} address - The original IP address string to be defanged.
5// @return {string} The defanged IP address.
6function defangIPaddr(address: string): string {
7    // Split the original IP address into an array of strings, breaking it at each period ('.').
8    const addressParts: string[] = address.split('.');
9  
10    // Join the array of string parts back together, inserting '[.]' between the elements, effectively
11    // replacing periods with '[.]'.
12    const defangedAddress: string = addressParts.join('[.]');
13  
14    // Return the resulting defanged IP address.
15    return defangedAddress;
16}
17

Time and Space Complexity

The time complexity of the defangIPaddr method is O(n), where n is the length of the input string address. This is because str.replace() is a linear-time operation that goes through each character in the input string once to make the replacements.

The space complexity is also O(n), as the replace function creates a new string with the '[.]' replacing each '.' in the original address. In the worst case, if there are k occurrences of '.' in the address, the new string will have a length of n + 3k (since each '.' is replaced by '[.]' which is three characters long), which is still linear with respect to the size of the input.

Learn more about how to find time and space complexity quickly using problem constraints.


Discover Your Strengths and Weaknesses: Take Our 2-Minute Quiz to Tailor Your Study Plan:
Question 1 out of 10

What's the output of running the following function using input [30, 20, 10, 100, 33, 12]?

1def fun(arr: List[int]) -> List[int]:
2    import heapq
3    heapq.heapify(arr)
4    res = []
5    for i in range(3):
6        res.append(heapq.heappop(arr))
7    return res
8
1public static int[] fun(int[] arr) {
2    int[] res = new int[3];
3    PriorityQueue<Integer> heap = new PriorityQueue<>();
4    for (int i = 0; i < arr.length; i++) {
5        heap.add(arr[i]);
6    }
7    for (int i = 0; i < 3; i++) {
8        res[i] = heap.poll();
9    }
10    return res;
11}
12
1class HeapItem {
2    constructor(item, priority = item) {
3        this.item = item;
4        this.priority = priority;
5    }
6}
7
8class MinHeap {
9    constructor() {
10        this.heap = [];
11    }
12
13    push(node) {
14        // insert the new node at the end of the heap array
15        this.heap.push(node);
16        // find the correct position for the new node
17        this.bubble_up();
18    }
19
20    bubble_up() {
21        let index = this.heap.length - 1;
22
23        while (index > 0) {
24            const element = this.heap[index];
25            const parentIndex = Math.floor((index - 1) / 2);
26            const parent = this.heap[parentIndex];
27
28            if (parent.priority <= element.priority) break;
29            // if the parent is bigger than the child then swap the parent and child
30            this.heap[index] = parent;
31            this.heap[parentIndex] = element;
32            index = parentIndex;
33        }
34    }
35
36    pop() {
37        const min = this.heap[0];
38        this.heap[0] = this.heap[this.size() - 1];
39        this.heap.pop();
40        this.bubble_down();
41        return min;
42    }
43
44    bubble_down() {
45        let index = 0;
46        let min = index;
47        const n = this.heap.length;
48
49        while (index < n) {
50            const left = 2 * index + 1;
51            const right = left + 1;
52
53            if (left < n && this.heap[left].priority < this.heap[min].priority) {
54                min = left;
55            }
56            if (right < n && this.heap[right].priority < this.heap[min].priority) {
57                min = right;
58            }
59            if (min === index) break;
60            [this.heap[min], this.heap[index]] = [this.heap[index], this.heap[min]];
61            index = min;
62        }
63    }
64
65    peek() {
66        return this.heap[0];
67    }
68
69    size() {
70        return this.heap.length;
71    }
72}
73
74function fun(arr) {
75    const heap = new MinHeap();
76    for (const x of arr) {
77        heap.push(new HeapItem(x));
78    }
79    const res = [];
80    for (let i = 0; i < 3; i++) {
81        res.push(heap.pop().item);
82    }
83    return res;
84}
85

Recommended Readings

Want a Structured Path to Master System Design Too? Don’t Miss This!


Load More