LeetCode93. Restore IP Addresses

文章目录

一、题目

A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros.

For example, "0.1.2.201" and "192.168.1.1" are valid IP addresses, but "0.011.255.245", "192.168.1.312" and "192.168@1.1" are invalid IP addresses.

Given a string s containing only digits, return all possible valid IP addresses that can be formed by inserting dots into s. You are not allowed to reorder or remove any digits in s. You may return the valid IP addresses in any order.

Example 1:

Input: s = "25525511135"

Output: "255.255.11.135","255.255.111.35"

Example 2:

Input: s = "0000"

Output: "0.0.0.0"

Example 3:

Input: s = "101023"

Output: "1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"

Constraints:

1 <= s.length <= 20

s consists of digits only.

二、题解

注意c++中字符串的insert方法和erase方法

cpp 复制代码
class Solution {
public:
    vector<string> res;
    bool isValid(string& s,int start,int end){
        if(start > end) return false;
        if(s[start] == '0' && start != end) return false;
        int num = 0;
        for(int i = start;i <= end;i++){
            if(s[i] < '0' || s[i] > '9') return false;
            num = num * 10 + s[i] - '0';
            if(num > 255) return false;
        }
        return true;
    }
    void backtracking(string s,int startIndex,int pointSum){
        if(pointSum == 3){
            if(isValid(s,startIndex,s.size()-1)){
                res.push_back(s);
                return;
            }
        }
        for(int i = startIndex;i < s.size();i++){
            //合法的情况下
            if(isValid(s,startIndex,i)){
                s.insert(s.begin() + i + 1,'.');
                pointSum++;
                backtracking(s,i + 2,pointSum);
                s.erase(s.begin() + i + 1);
                pointSum--;
            }
            else break;
        }
    }
    vector<string> restoreIpAddresses(string s) {
        backtracking(s,0,0);
        return res;
    }
};
相关推荐
Tisfy9 分钟前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-9 分钟前
【技巧】LC 136.只出现一次的数字
算法·异或
不会代码的小猴24 分钟前
C++新增关键字
开发语言·c++·笔记
专注仿真1 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
liulilittle1 小时前
并发与内存安全术语:定义、分类与关联
c++·安全·并发·术语
_wyt0011 小时前
从图到树:9道洛谷基础题带你入门树形结构
c++·
zlinear数据采集卡2 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
Titan20242 小时前
Linux网络基础知识
linux·服务器·网络·c++·学习
白狐_7983 小时前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表
GeekZHR3 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针