1.6 - 复制IP地址 && vector和list的区别

目录

1.复制IP地址

a.核心思想

b.思路

c.步骤

2.list和vector的区别


1.复制IP地址

93. 复原 IP 地址 - 力扣(LeetCode)https://leetcode.cn/problems/restore-ip-addresses/description/

cpp 复制代码
class Solution {
public:
    vector<string> restoreIpAddresses(string s) {
        vector<string> result;   // 存储结果集
        // 输入有效性检查:IP地址最多由12个数字组成
        if (s.size() > 12) 
            return result;
        
        string path; // 当前路径(存储临时IP地址段)
        backtrack(s, 0, 0, path, result); // 从第0个字符开始回溯
        return result;
    }

    void backtrack(string& s, int start, int segment, string& path, vector<string>& result) {
        // 成功条件:生成4段且用完所有字符
        if (start == s.size() && segment == 4) 
        {
            path.pop_back(); // 移除末尾多余的点(如"192.168.1.1."→"192.168.1.1")
            result.push_back(path);
            return;
        }
        
        // 失败条件:越界或已生成4段
        if (start >= s.size() || segment >= 4) 
            return;

        // 尝试当前段的3种可能长度(1-3位)
        for (int len = 1; len <= 3; len++) 
        {
            // 防止越界检查
            if (start + len > s.size()) 
                break;
            
            string sub = s.substr(start, len); // 截取当前段
            
            // 有效性检查:
            // 1. 长度>1时不能以0开头(排除"01"类无效地址)
            // 2. 数值范围必须在0-255之间
            if ((sub.size() > 1 && sub[0] == '0') || stoi(sub) > 255) 
                break;
            
            // 生成新路径(避免修改原始path)
            string newPath = path + sub + ".";
            
            // 递归:处理下一段(位置后移len,段数+1)
            backtrack(s, start + len, segment + 1, newPath, result);
            
            // 注意:newPath是局部变量,递归返回后自动销毁
            // 无需手动恢复path状态
        }
    }
};

a.核心思想

通过回溯法,在给定的数字字符串中插入三个点,将字符串分成四部分,判断每部分是否满足有效IP地址的条件,若满足则将其加入结果列表。

b.思路

① 使用回溯法遍历所有可能的插入点的位置。

② 对于每一种分割方式,检查四部分是否都满足有效IP地址的条件(整数在0到255之间,且不能有前导0,除非整数就是0)。

③ 如果满足条件,则将该IP地址加入结果列表。

c.步骤

① 定义回溯函数,参数包括当前字符串、当前分割的段数、当前路径和结果列表。

② 在回溯函数中,如果已经分割成四段且字符串已用完,则将当前路径加入结果列表。

③ 遍历所有可能的分割点,对每一段进行检查,如果满足条件则继续回溯。

④ 返回结果列表。

2.list和vector的区别

|---------------|-----------------------------------------------------------|------------------------------------------------|
| | vector | list |
| 底层数据结构 | 动态数组,连续内存存储,支持随机访问 | 双向链表,非连续内存存储,节点分散在内存中 |
| 访问效率 | 1. 支持 O(1) 随机访问(通过下标 []at()) 2. 遍历速度快,缓存友好(内存连续) | 1. 不支持随机访问,必须从头/尾开始遍历(O(n)) 2. 访问任意元素较慢 |
| 插入/删除效率 | 1. 尾部插入/删除 O(1)(均摊) 2. 中间或头部插入/删除 O(n)(需要移动后续元素) | 1. 任意位置插入/删除 O(1)(只需修改指针) 2. 适合频繁插入/删除的场景 |
| 内存 使用 | 1. 内存连续,预分配容量(capacity),可能浪费内存 2. 扩容时需重新分配内存并复制元素(代价高) | 1. 每个节点独立分配内存,无预分配 2. 内存开销更大(每个节点存储前后指针) |
| 适用场景 | 1. 需要随机访问或尾部操作 2. 数据量可预测,减少扩容开销 | 1. 频繁插入/删除,且不关心随机访问 2. 数据量变化大,避免 vector 扩容开销 |

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
仟濹2 分钟前
算法打卡day2 (2026-02-07 周五) | 算法: DFS | 3_卡码网99_计数孤岛_DFS
算法·深度优先
驭渊的小故事5 分钟前
简单模板笔记
数据结构·笔记·算法
YuTaoShao20 分钟前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头27 分钟前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa36 分钟前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior37 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος19001 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl1 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL1 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试
智者知已应修善业1 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法