C++第二阶段------数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!
文章目录
- 一、131.分割回文串
- [二、93. 复原 IP 地址](#二、93. 复原 IP 地址)
一、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;
}
};