题目:
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000"
输出:["0.0.0.0"]
示例 3:
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
s 仅由数字组成
解题思路:用三层for循环,每层循环通过string的函数s.substr(int pos,int count)从下标pos位置向后截取count个,这样截取到一个字符串,原字符串保持不变的,对该字符串先判断是否为‘0’开头,通过stoi()方法将字符串化为整形判断其是否大于255,若都符合条件记录该字符串,进行下一次循环,直至最后一层循环要判断两个字符串,一个是IP地址的第三个字符串,另一个是剩余数字组成的IP地址的第四个字符串。
注:for循环条件为1到3因为,IP地址每一个字符串长度为1到3。
解题代码为:
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
int n=s.size();//记录字符串长度
vector<string> vec;
for(int i=1;i<=3;i++){
string t1=s.substr(0,i);//截取IP地址的第一个字符串
if(t1.size()>1&&t1[0]=='0'){//若其长度大于1时,需要判断其是否为0开头
break;
}
if(stoi(t1)>255){//判断其化为整形时是否大于255
break;
}
for(int j=1;j<=3;j++){
if(i+j>=n){//因为IP地址除了第2个字符串,后面还有两所以需要进行一个长度判断
break;
}
string t2=s.substr(i,j);
if(t2.size()>1&&t2[0]=='0'){
break;
}
if(stoi(t2)>255){
break;
}
for(int k=1;k<=3;k++){
if(i+j+k>=n){
break;
}
string t3=s.substr(i+j,k);
if(t3.size()>1&&t3[0]=='0'){
break;
}
if(stoi(t3)>255){
break;
}
string t4=s.substr(i+j+k,n-i-j-k);
if(t4.size()>1&&t4[0]=='0'){
continue;//IP地址最后一个字符串使用continue是因为第3个字符串可以改变其情况,不能直接break
}
if(t4.size()>3){//stoi 在遇到非常大的数字时可能会因为整数溢出而失败,所以对于剩余数字个数需要进行一个判断
continue;
}
if(stoi(t4)>255){
continue;
}
string temp=t1+"."+t2+"."+t3+"."+t4;
vec.push_back(temp);
}
}
}
return vec;
}
};
标签:break,string,力扣,stoi,IP地址,字符串,打卡,255
From: https://blog.csdn.net/2401_84164461/article/details/144411073