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&Develop3 分钟前
springboot + mysql8降低版本到 mysql5.7
java·spring boot·后端
sg_knight5 分钟前
从单体架构到微服务:架构演进之路
java·spring boot·spring·spring cloud·微服务·云原生·架构
ggabb6 分钟前
当九九乘法口诀“出海”英国:文化碰撞下的数学教育变革
算法
kchmmd11 分钟前
CMakeLists生成调用静态动态库可执行demo
c++
爱coding的橙子13 分钟前
每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h
算法·leetcode
武昌库里写JAVA20 分钟前
MacOS Python3安装
java·开发语言·spring boot·学习·课程设计
eternal__day27 分钟前
Spring Cloud:构建云原生微服务架构的最佳工具和实践
java·spring cloud·微服务·云原生·架构
cdut_suye27 分钟前
【Linux系统】从 C 语言文件操作到系统调用的核心原理
java·linux·数据结构·c++·人工智能·机器学习·云计算
wuqingshun31415928 分钟前
蓝桥杯 10. 全球变暖
c++·算法·职场和发展·蓝桥杯
forestsea34 分钟前
Maven 插件参数注入与Mojo开发详解
java·maven·mojo