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;
    }
};
相关推荐
Nebula_g1 小时前
JavaSE加强:IO流
java·开发语言·windows·stream·javase
rannn_1111 小时前
JVM 面试题:类加载过程详解(附高频考点)
java·jvm·后端
程序猿乐锅5 小时前
从0-1一文详解RabbitMQ
java·分布式·后端·中间件·rabbitmq·ruby
考虑考虑8 小时前
JDK26中的List.ofLazy()
java·后端·java ee
小蒜学长8 小时前
基于SpringBoot的公寓报修管理系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·公寓报修管理系统·多角色协同
for_ever_love__8 小时前
MySQL 主从复制讲透:binlog 原理、搭建步骤与读写分离
java·数据库·mysql·binlog·读写分离·原理·主从复制
Nil20810 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
小π军11 小时前
操作系统面试题
java·linux·服务器
倔强的石头10611 小时前
应用账号最小权限实践:读写账号、报表账号、运维账号分层
java·运维·开发语言