给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]
class Solution {//回溯法
vector<string>res;
string sel;
public:
vector<string> restoreIpAddresses(string s) {
int sSize=s.size();
if(sSize<4||sSize>12)return {};
sel=s;
helper(0,0,"");
return res;
}
void helper(int start,int cnt,string path){//当前下标;当前第几个分块;路径
if(cnt==4)
if(start==sel.size()){//找到
path.pop_back();//去除最后一个点‘.’
res.push_back(path);
return;
}
else return;//越界
for(int i=1;i<=3&&start+i<=sel.size();++i){//依此检查sel.substr(start,i)是否满足
if(i==2&&sel[start]=='0')break;//注意!!!两位数和三位数时,第一位不能为0
if(i==3&&stoi(sel.substr(start,i))>255)break;//三位数时必须小于256
helper(start+i,cnt+1,path+sel.substr(start,i)+'.');
}
}
};
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if(!root)return {};
deque<TreeNode*>q;
vector<vector<int>>res;
q.push_back(root);
bool front_back=true;//判断双端队列从那一头开始遍历,true则首端,false则尾端
while(q.size()){
int qSize=q.size();
vector<int>path;
while(qSize--)
if(front_back){//首端出队,尾端入队,入队顺序:左子树-右子树
auto temp=q.front();
q.pop_front();
path.push_back(temp->val);
if(temp->left)
q.push_back(temp->left);
if(temp->right)
q.push_back(temp->right);
}
else{//尾端出队,首端入队,入队顺序:右子树-左子树
auto temp=q.back();
q.pop_back();
path.push_back(temp->val);
if(temp->right)
q.push_front(temp->right);
if(temp->left)
q.push_front(temp->left);
}
front_back=!front_back;
res.push_back(path);
}
return res;
}
};