LeetCode 1108: Defanging an IP Address (Linear String Builder Replacement)
LeetCode 1108StringSimulationBuilderToday we solve LeetCode 1108 - Defanging an IP Address.
Source: https://leetcode.com/problems/defanging-an-ip-address/
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