C++数据结构与算法——回溯算法分割问题

C++第二阶段------数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!

文章目录

一、131.分割回文串

cpp 复制代码
class Solution {
public:
    vector<vector<string>> result;
    vector<string> path;
    vector<vector<string>> partition(string s) {
        insertS(s,0);
        return result;
    }
    // 填充函数
    void insertS(string s,int startIndex){
        // 结束条件
        if(startIndex>=s.length()){
            result.push_back(path);
            return;
        }
        for(int i=startIndex;i<s.length();i++){
            if(isPart(s,startIndex,i)){
                path.push_back(s.substr(startIndex,i-startIndex+1));
                
            }
            else{
                continue;
            }
            insertS(s,i+1);
            path.pop_back();

        }

    }
    // 定义一个判断回文字符串的函数
    bool isPart(string s,int begin,int end){
        if(s.length()==1){
            return true;
        }
        while(begin<end){
            if(s[begin]!=s[end]){
                return false;
            }
            begin++;
            end--;
        }
        return true;
    }
};

二、93. 复原 IP 地址

cpp 复制代码
class Solution {
public:
    vector<string> result;
    int count=0;
    vector<string> restoreIpAddresses(string s) {
        if(s.size()<4||s.size()>12) return result;
        insertS(s,0);
        return result;
    }
    void insertS(string s,int stardIndex){
        // 收集结果
        if(count==3){
            // 判断后面的符不符合规则
            if(isValid(s,stardIndex,s.length()-1)){
                result.push_back(s);
            }
            return;
        }
        for(int i= stardIndex;i<s.length();i++){
            // 判断前面的符不符合规则
            if(isValid(s,stardIndex,i)){
                // 符合规则,在哪个位置插入"."
                s.insert(s.begin()+i+1,'.');
                count++;
                insertS(s,i+2);
                count--;
                s.erase(s.begin()+i+1);
            }
            else{
                break;
            }
        }
    }
    bool isValid(string s,int begin,int end){
        if (begin > end) {
            return false;
        }
        // 左闭右闭
        // 1. 第一个为0
        if(s[begin]=='0'&& begin != end) return false;
        // 2. 有特殊字符
        int num = 0;
        for(int i=begin;i<=end;i++){
            if((s[i]<='9'&&s[i]>='0')){
                num= num * 10 + (s[i] - '0');
            }
            else{
                return false;
            }
        }
        // 3. 数字不符合区间
        if(num>255) return false;
        return true;
    }
};
相关推荐
Java技术小馆2 分钟前
langChain开发你的第一个 Agent
java·面试·架构
kangkang-3 分钟前
PC端基于SpringBoot架构控制无人机(二):MavLink协议
java·spring boot·后端·无人机
Dcs14 分钟前
Anthropic 爆严重安全漏洞!程序员机器沦陷
java
你的冰西瓜18 分钟前
C++ 中最短路算法的详细介绍
c++·算法·图论·最短路
zstar-_24 分钟前
【算法笔记】6.LeetCode-Hot100-链表专项
笔记·算法·leetcode
Swift社区30 分钟前
Swift 图论实战:DFS 算法解锁 LeetCode 323 连通分量个数
算法·swift·图论
<但凡.33 分钟前
数据结构与算法之美:广义表
数据结构·c++·算法
EnigmaCoder35 分钟前
Java多线程:核心技术与实战指南
java·开发语言
攀小黑38 分钟前
阿里云 使用TST Token发送模板短信
java·阿里云
前端极客探险家44 分钟前
告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
前端·算法·性能优化