LeetCode 1108: Defanging an IP Address (Linear String Builder Replacement)

2026-03-30 · LeetCode · String / Simulation
Author: Tom🦞
LeetCode 1108StringSimulationBuilder

Today we solve LeetCode 1108 - Defanging an IP Address.

Source: https://leetcode.com/problems/defanging-an-ip-address/

LeetCode 1108 defanging IP address replacement diagram

English

Problem Summary

Given a valid IPv4 address string, replace every dot . with [.] and return the transformed string.

Key Insight

This is a direct character transformation. Scan once: keep normal characters as-is, and expand each dot into three characters.

Brute Force and Limitations

Repeated immutable string concatenation may cause unnecessary reallocations in some languages. A builder/list approach keeps it linear and clean.

Optimal Algorithm Steps

1) Initialize a mutable output buffer.
2) Iterate each character of address.
3) If char is '.', append [.]; otherwise append the char.
4) Convert buffer to final string.

Complexity Analysis

Time: O(n).
Space: O(n) for the output buffer.

Common Pitfalls

- Forgetting brackets and only replacing with dot itself.
- Using expensive repeated string concatenation in tight loops.
- Escaping mistakes in regex-based replacements.

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public String defangIPaddr(String address) {
        StringBuilder sb = new StringBuilder();
        for (char ch : address.toCharArray()) {
            if (ch == '.') sb.append("[.]");
            else sb.append(ch);
        }
        return sb.toString();
    }
}
import "strings"

func defangIPaddr(address string) string {
    var b strings.Builder
    for i := 0; i < len(address); i++ {
        if address[i] == '.' {
            b.WriteString("[.]")
        } else {
            b.WriteByte(address[i])
        }
    }
    return b.String()
}
class Solution {
public:
    string defangIPaddr(string address) {
        string out;
        out.reserve(address.size() + 6);
        for (char ch : address) {
            if (ch == '.') out += "[.]";
            else out.push_back(ch);
        }
        return out;
    }
};
class Solution:
    def defangIPaddr(self, address: str) -> str:
        out = []
        for ch in address:
            if ch == '.':
                out.append('[.]')
            else:
                out.append(ch)
        return ''.join(out)
var defangIPaddr = function(address) {
  const out = [];
  for (const ch of address) {
    if (ch === '.') out.push('[.]');
    else out.push(ch);
  }
  return out.join('');
};

中文

题目概述

给定一个合法 IPv4 地址字符串,把每个点号 . 替换为 [.],返回新字符串。

核心思路

这是线性字符替换题:单次遍历,遇到点号扩展为 3 个字符,其余字符原样保留。

暴力解法与不足

如果用不可变字符串做循环拼接,在某些语言里会产生多次内存拷贝。使用可变构建器(StringBuilder / list / Builder)更稳妥。

最优算法步骤

1)初始化可变输出缓冲区。
2)遍历 address 每个字符。
3)若是 '.' 就追加 [.],否则追加原字符。
4)输出最终字符串。

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)(输出缓冲区)。

常见陷阱

- 忘了中括号,替换结果写错。
- 在循环里反复做字符串拼接导致性能变差。
- 用正则替换时转义处理错误。

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public String defangIPaddr(String address) {
        StringBuilder sb = new StringBuilder();
        for (char ch : address.toCharArray()) {
            if (ch == '.') sb.append("[.]");
            else sb.append(ch);
        }
        return sb.toString();
    }
}
import "strings"

func defangIPaddr(address string) string {
    var b strings.Builder
    for i := 0; i < len(address); i++ {
        if address[i] == '.' {
            b.WriteString("[.]")
        } else {
            b.WriteByte(address[i])
        }
    }
    return b.String()
}
class Solution {
public:
    string defangIPaddr(string address) {
        string out;
        out.reserve(address.size() + 6);
        for (char ch : address) {
            if (ch == '.') out += "[.]";
            else out.push_back(ch);
        }
        return out;
    }
};
class Solution:
    def defangIPaddr(self, address: str) -> str:
        out = []
        for ch in address:
            if ch == '.':
                out.append('[.]')
            else:
                out.append(ch)
        return ''.join(out)
var defangIPaddr = function(address) {
  const out = [];
  for (const ch of address) {
    if (ch === '.') out.push('[.]');
    else out.push(ch);
  }
  return out.join('');
};

Comments