class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* dummy = new ListNode(0), *a, *b, *c;
dummy->next = head, a = dummy;
for(int i = 0; i < m - 1; i++)
a = a->next;
b = a->next, c = b->next;
for(int i = 0; i < n - m;i++)
{
ListNode* t = c->next;
c->next = b;
b = c, c = t;
}
a->next->next = c;
a->next = b;
return dummy->next;
}
};
class Solution {
public:
vector<string> res;
int n;
public:
vector<string> restoreIpAddresses(string s) {
n = s.size();
if(!n) return res;
vector<int> dots;
dfs(0, 4, dots, s);
return res;
}
void dfs(int u, int cnt, vector<int>& dots, string& s)
{
// 剪枝条件:剩下的元素不够分了
if(n - u < cnt || n - u > 3 * cnt) return;
if(cnt == 0)
{
stringstream ss;
for(int i = 0; i < 3; i++)
{
ss << s.substr(dots[i], dots[i + 1] - dots[i]);
ss << '.';
}
ss << s.substr(dots.back());
res.push_back(ss.str());
return;
}
// 枚举场景
// 一个元素
dots.push_back(u);
dfs(u + 1, cnt - 1, dots, s);
// 两个元素
if(u + 1 < n && s[u] != '0')
{
dfs(u + 2, cnt - 1, dots, s);
}
// 三个元素
if(u + 2 < n)
{
int val = stoi(s.substr(u, 3));
if(val >= 100 && val <= 255)
dfs(u + 3, cnt - 1, dots, s);
}
dots.pop_back();
}
};
class Solution {
public:
vector<string> res;
int n;
public:
vector<string> restoreIpAddresses(string s) {
n = s.size();
if(!n) return res;
dfs(s, 0, 0, "");
return res;
}
void dfs(string& s, int u, int k, string path)
{
if(u == n)
{
if(k == 4)
{
path.pop_back();
res.push_back(path);
}
return;
}
if(k == 4) return;
for(int i = u, t = 0; i < n; i++)
{
if(i > u && s[u] == '0') break;
t = t * 10 + s[i] - '0';
if(t <= 255)
dfs(s, i + 1, k + 1, path + to_string(t) + '.');
else break;
}
}
};