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

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

感谢大家的三连支持!

相关推荐
wuweijianlove4 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
研究点啥好呢4 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong4 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志4 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
沫璃染墨4 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
黎阳之光4 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_114 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg5 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒5 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode