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

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

感谢大家的三连支持!

相关推荐
CSDN_RTKLIB1 小时前
两版本锁抛出异常测试
c++
晨非辰1 小时前
Linux权限管理速成:umask掩码/file透视/粘滞位防护15分钟精通,掌握权限减法与安全协作模型
linux·运维·服务器·c++·人工智能·后端
TracyCoder1239 小时前
LeetCode Hot100(15/100)——54. 螺旋矩阵
算法·leetcode·矩阵
u01092727110 小时前
C++中的策略模式变体
开发语言·c++·算法
2501_9418372610 小时前
停车场车辆检测与识别系统-YOLOv26算法改进与应用分析
算法·yolo
Aevget11 小时前
MFC扩展库BCGControlBar Pro v37.2新版亮点:控件功能进一步升级
c++·mfc·界面控件
六义义11 小时前
java基础十二
java·数据结构·算法
四维碎片11 小时前
QSettings + INI 笔记
笔记·qt·算法
Tansmjs11 小时前
C++与GPU计算(CUDA)
开发语言·c++·算法
独自破碎E12 小时前
【优先级队列】主持人调度(二)
算法