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;
    }
};
相关推荐
2601_956121972 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
Java牛马2 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌3 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
fpcc3 小时前
跟我学C++中级篇——编译期的条件选择
开发语言·c++
东小西3 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
兴通物联科技4 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
mqiqe4 小时前
AgentScope Java 2.0 协议集成全景解析:A2A、AG-UI、Agent Protocol 三大开放协议实战指南
java·开发语言·ui
脉动数据行情4 小时前
Java 实现台股 TWSE/TPEx 行情采集(个股 + K 线)
java·开发语言·twse·tpex·台股
月华路6 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法