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;
    }
};
相关推荐
budingxiaomoli11 小时前
优选算法--链表
数据结构·算法·链表
温柔的小猪竹11 小时前
面向对象的六大原则
java
洛小豆11 小时前
孤儿资源治理:如何优雅处理“上传了但未提交”的冗余文件?
java·后端·面试
a努力。11 小时前
中国电网Java面试被问:分布式缓存的缓存穿透解决方案
java·开发语言·分布式·缓存·postgresql·面试·linq
草莓熊Lotso11 小时前
脉脉独家【AI创作者xAMA】| 开启智能创作新时代
android·java·开发语言·c++·人工智能·脉脉
爱吃山竹的大肚肚11 小时前
Kafka中auto-offset-reset各个选项的作用
java·spring boot·spring·spring cloud
漫随流水11 小时前
leetcode算法(637.二叉树的层平均值)
数据结构·算法·leetcode·二叉树
只想要搞钱11 小时前
java 常用业务方法-记录
java
CodeAmaz11 小时前
HashMap 面试全攻略
java·hashmap
moxiaoran575311 小时前
Java设计模式的运用
java·开发语言·设计模式