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 扩容开销 |

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

感谢大家的三连支持!

相关推荐
吃好睡好便好5 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅6 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
于小猿Sup7 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
x_yeyue8 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路9 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星9 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
小小编程路9 小时前
C++ 多线程与并发
java·jvm·c++
失去的青春---夕阳下的奔跑9 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光10 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩10 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up