代码随想录算法训练营第二十一天 | LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II
代码随想录算法训练营第二十一天 | LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II
01-1 LeetCode93.复原IP地址
相关资源
题目链接:93. 复原 IP 地址
文章讲解:LeetCode93:复原IP地址
视频讲解:LeetCode:93.复原IP地址
题目:
有效 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
中的任何数字。你可以按 任何 顺序返回答案。
第一想法:类似于回文子串,用"."进行分割
遇到的困难:这道题目写了好久好久才写出来,主要问题在于递归的终止条件不太清楚,并且判断每个整数段是否位于 0
到 255
之间组成,且不能含有前导 0
写法上出错过。
实现:
class Solution {
public:
vector<string> result;
string str;
bool judge(string& s, int start, int end){
int count = 0;
if(end-start+1>3){
return false;
}
if(end==start){
return true;
}
if(end==start+1){
if(s[start]=='0'){
return false;
}
else{
return true;
}
}
if(end==start+2){
if(s[start]=='0'){
return false;
}
else{
count += (s[start]-'0')*100+(s[start+1]-'0')*10+s[start+2]-'0';
if(count<=255){
return true;
}
else{
return false;
}
}
}
return false;
}
void backtracking(string& s, int startIndex, int part){
if(startIndex >= s.size()){
return;
}
if(part == 3){
if(judge(s,startIndex,s.size()-1)){
string str_cut = s.substr(startIndex, s.size()-startIndex);
string str_temp = str + str_cut;
result.push_back(str_temp);
}
return;
}
for(int i = startIndex; i <= startIndex + 2 && i < s.size(); i++ ){
if(judge(s,startIndex,i)){
string str_cut = s.substr(startIndex, i-startIndex+1);
str = str + str_cut + ".";
backtracking(s,i+1,part+1);
for(int i = 0; i < str_cut.size() + 1; i++){
str.pop_back();
}
}
}
return;
}
vector<string> restoreIpAddresses(string s) {
backtracking(s,0,0);
return result;
}
};
看完代码随想录之后的想法: 思路大差不差,但录哥直接在原字符串中insert
和erease
ToDo:复习!
01-2 LeetCode78.子集
相关资源
- 题目链接:78. 子集
- 文章讲解:LeetCode78.子集
- 视频讲解:LeetCode:78.子集
题目:
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
第一想法:其实就是组合,但需要把空集加入结果集,并且每个叶子节点都要记录
实现:
class Solution {
public:
vector<vector<int>> result;
vector<int> rec;
void backtracking(vector<int>& nums, int startIndex){
if(startIndex >= nums.size()){
return;
}
for(int i = startIndex; i < nums.size(); i++){
rec.push_back(nums[i]);
result.push_back(rec);
backtracking(nums, i+1);
rec.pop_back();
}
return;
}
vector<vector<int>> subsets(vector<int>& nums) {
result.push_back(rec);
backtracking(nums,0);
return result;
}
};
看完代码随想录之后的想法:思路一致
ToDo:复习
01-3 LeetCode90.子集II
相关资源
题目链接:90. 子集 II
文章讲解:子集II
视频讲解: LeetCode:90.子集II
题目:
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
第一想法:和之前的组合总和II很相似,也是需要一个去重的过程
实现:
class Solution {
public:
vector<vector<int>> result;
vector<int> rec;
void backtracking(vector<int>& nums, int startIndex){
result.push_back(rec);
if(startIndex >= nums.size()){
return;
}
for(int i = startIndex; i < nums.size(); i++){
if(i>startIndex && nums[i]==nums[i-1]){
continue;
}
rec.push_back(nums[i]);
backtracking(nums, i+1);
rec.pop_back();
}
return;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
sort(nums.begin(),nums.end());
backtracking(nums,0);
return result;
}
};
看完代码随想录之后的想法:思路一致
ToDo:勤加复习