代码随想录day30
93.
分割字符串的变体,在回溯的时候注意添加标点然后注意回溯起点,设计判断IP地址是否正确的方法。
/*
* @lc app=leetcode.cn id=93 lang=cpp
*
* [93] 复原 IP 地址
*/
// @lc code=start
#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
vector<string> result;
void backtracing(string& s,int startindex,int pointnum){
if(pointnum==3){
if(isValid(s,startindex,s.size()-1)){
result.push_back(s);
}
return;
}
for(int i=startindex;i<s.size();i++){
if(isValid(s,startindex,i)){
s.insert(s.begin() + i + 1 , '.');
pointnum++;
backtracing(s, i + 2, pointnum);
pointnum--;
s.erase(s.begin() + i + 1);
}else break;
}
}
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]>'9'||s[i]<'0')
{
return false;
}
num=num*10+(s[i]-'0');
if(num>255){
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
result.clear();
if(s.size()<4||s.size()>12)
return result;
backtracing(s,0,0);
return result;
}
};
// @lc code=end
78.
这题比较简单,套回溯模板即可。
/*
* @lc app=leetcode.cn id=93 lang=cpp
*
* [93] 复原 IP 地址
*/
// @lc code=start
#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
vector<string> result;
void backtracing(string& s,int startindex,int pointnum){
if(pointnum==3){
if(isValid(s,startindex,s.size()-1)){
result.push_back(s);
}
return;
}
for(int i=startindex;i<s.size();i++){
if(isValid(s,startindex,i)){
s.insert(s.begin() + i + 1 , '.');
pointnum++;
backtracing(s, i + 2, pointnum);
pointnum--;
s.erase(s.begin() + i + 1);
}else break;
}
}
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]>'9'||s[i]<'0')
{
return false;
}
num=num*10+(s[i]-'0');
if(num>255){
return false;
}
}
return true;
}
public:
vector<string> restoreIpAddresses(string s) {
result.clear();
if(s.size()<4||s.size()>12)
return result;
backtracing(s,0,0);
return result;
}
};
// @lc code=end
90.
与上一个相比增加了去重判断,学会去重判断逻辑。
/*
* @lc app=leetcode.cn id=90 lang=cpp
*
* [90] 子集 II
*/
// @lc code=start
#include<iostream>
#include<vector>
using namespace std;
class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracing(vector<int>&nums,int startindex,vector<bool>used){
result.push_back(path);
for(int i=startindex;i<nums.size();i++){
if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false){
continue;
}
path.push_back(nums[i]);
used[i]=true;
backtracing(nums,i+1,used);
path.pop_back();
used[i]=false;
}
}
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
result.clear();
path.clear();
vector<bool>used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracing(nums,0,used);
return result;
}
};
// @lc code=end