93 复原IP地址
题目链接
思路
和切分回文字符串最大的差别在于判断是否合法的函数。其他基本相同。debug的时候发现:字符串比较的时候,注意 "32" > "255",因为字符串比较时,用大于小于等于号,从高到低位依次比较字典序,这样会返回错误的答案,正确做法应该是转换成数字再比较。
文章详解
cpp
class Solution {
public:
vector<string> result;
string ip_tmp;
int str_count = 0;
bool isValid(const string& s,int start,int end)
{
string str(s,start,end - start + 1);
int num = 0;
if(str.length() > 3)
{
return false;
}else
//无前导0
if(str[0] == '0' && str.length() > 1)
{
return false;
}
else
//范围内
for (int i = start; i <= end; i++)
{
if (!isdigit(s[i])) return false;
num = num * 10 + (s[i] - '0');
}
return num <= 255;
}
void backtracing(const string& s, int start)
{
if(start == s.size() && str_count == 4)
{
result.push_back(ip_tmp);
return;
}
for(int i = start; i < s.size();i++) //不超过3位
{
if (isValid(s,start,i))
{
string str(s,start,i-start+1);
//cout << str << endl;
if(!ip_tmp.empty()) //不为开头,前面加.
{
str.insert(str.begin(),'.');
}
ip_tmp.append(str);
str_count++;
backtracing(s,i+1);
//cout << ip_tmp << endl;
ip_tmp.erase(ip_tmp.end() - str.size(), ip_tmp.end());
str_count--;
//cout << ip_tmp << endl;
}
}
}
vector<string> restoreIpAddresses(const string& s) {
// if(s.length() < 4)
// {
// return result;
// }
backtracing(s,0);
return result;
}
};
78 子集
题目链接
思路
和模板大差不差,处理时函数开始result就加入group,防止漏掉自己
cpp
class Solution {
public:
vector<vector<int>> result;
vector<int> group;
void backtracing(vector<int>& nums, int startIndex)
{
result.push_back(group);
if(startIndex >= nums.size())
{
return;
}
for(int i = startIndex; i < nums.size(); i++)
{
group.push_back(nums[i]);
backtracing(nums,i + 1);
group.pop_back();
}
}
vector<vector<int>> subsets(vector<int>& nums) {
backtracing(nums,0);
return result;
}
};
90 子集II
题目链接
思路
注意如何去重:用一个数组used,前一个数和后一个数相同,且前一个数的used标记为false,说明这个数在这一层已经被用过了,返回;
文章详解
cpp
class Solution {
public:
vector<vector<int>> result;
vector<int> group;
void backtracing(vector<int>& nums, int startIndex,vector<bool>& used)
{
result.push_back(group);
if(startIndex >= nums.size())
{
return;
}
for(int i = startIndex; i < nums.size(); i++)
{
if(i > 0 && nums[i] == nums[i-1] && used[i-1] == false)
{
continue;
}
group.push_back(nums[i]);
used[i] = true;
backtracing(nums,i + 1,used);
used[i] = false;
group.pop_back();
}
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<bool> used(nums.size(),false);
sort(nums.begin(),nums.end());
backtracing(nums,0,used);
return result;
}
};