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

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

感谢大家的三连支持!

相关推荐
Once_day3 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~13 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
偷吃的耗子18 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
坚果派·白晓明24 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人31 分钟前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
小镇敲码人2 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn