- 博客主页:⭐️这是一只小逸白的博客鸭~⭐️
- 欢迎 关注❤️点赞收藏⭐️评论
- 小逸白正在备战实习,经常更新面试题和LeetCode题解,欢迎志同道合的朋友互相交流~
- 若有问题请指正,记得关注哦,感谢~
往期文章 :
题目:
正整数 n 代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
提示:
1 <= n <= 8
思路:
把
"("
当成+1
,")"
当成-1
,和为0
且个数为2*n
时即是答案
- 加入左括号,尝试每一种可能
- 加入右括号,尝试每一种可能
class Solution {
public:
vector<string> ans;
string cur;
int n;
char left = '(', right = ')';
vector<string> generateParenthesis(int n) {
this->n = n;
dfs(0, 0);
return ans;
}
void dfs(int count, int sum) {
// 如果个数超过2 * n or 左括号在前 or 右括号>n个 就不是有效括号组合
if(count > 2 * n || sum < 0 || sum > n) return ;
if(count == 2 * n && sum == 0) {
ans.emplace_back(cur);
return ;
}
// 尝试加入左括号
cur.push_back(left);
dfs(count + 1, sum + 1);
cur.pop_back();
// 尝试加入右括号
cur.push_back(right);
dfs(count + 1, sum - 1);
cur.pop_back();
}
};
题目:
给定一个字符串 s ,请将 s 分割成一些子串,使每个子串都是 回文串 ,返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例:
输入:s = “google”
输出:[[“g”,“o”,“o”,“g”,“l”,“e”],[“g”,“oo”,“g”,“l”,“e”],[“goog”,“l”,“e”]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成思路:
本题的递归树模型是一棵多叉树,图片来自力扣liweiwei1419大佬
如图所示
- 如果前缀字符串是回文,则可以产生分支和结点;
- 如果前缀字符串不是回文,则不产生分支和结点,这一步是剪枝操作。
在叶子结点是空字符串的时候结算,此时 从根结点到叶子结点的路径,就是结果集里的一个结果,使用深度优先遍历,记录下所有可能的结果。
class Solution {
public:
vector<vector<string>> ans;
vector<string> cur;
int n;
vector<vector<string>> partition(string s) {
n = s.length();
dfs(s, 0);
return ans;
}
void dfs(string& s, int index) {
// 到结尾查完了,将结果加入ans
if(index == n) {
ans.emplace_back(cur);
return ;
}
// 将从index开始的字符串都查一遍,是回文串的话就从下一个字符继续判断查找
for(int i = index; i < n; i++) {
if(isPalindrome(s, index, i)) {
cur.emplace_back(s.substr(index, i - index + 1));
dfs(s, i + 1);
cur.pop_back();
}
}
}
// 判断回文串
bool isPalindrome(string& s, int l, int r) {
while(l < r) {
if(s[l++] != s[r--]) return false;
}
return true;
}
};
题目:
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “[email protected]” 是 无效 IP 地址。
示例:
输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
提示:
0 <= s.length <= 3000
s
仅由数字组成思路:
本题的递归树模型是一棵多叉树,且深度为4,图片来自力扣liweiwei1419大佬
形成有效ip的条件:找到了4段Ip子段,且刚好遍历完字符串
剪枝:这个子段不符合[0, 255]
or
遍历完字符串但没找到四段ip 直接回溯
遇到首字符为0
,把它单独为一个子段,继续遍历后序字符串
找到答案时将cur
数组转成ip
字符串,再加入ans
class Solution {
public:
vector<string> ans;
vector<int> cur;
int n;
vector<string> restoreIpAddresses(string s) {
n = s.length();
cur.resize(4, 0);
dfs(s, 0, 0);
return ans;
}
// 0 <= count < 4, 0 <= index < s.length()
// cur 记录每一个字段的值,count记录字段个数,index为字符串下标
void dfs(string& s, int count, int index) {
// 如果找到了4段Ip,且刚好遍历完字符串,就是一种答案
if(count == 4) {
if(index == n) {
string ip;
for(int i = 0; i < 4; i++) {
ip += to_string(cur[i]);
if(i != 3) ip += ".";
}
ans.emplace_back(ip);
}
return ;
}
// 如果还没找到4段Ip就遍历完字符串,提前回溯
if(index == n) return ;
if(s[index] == '0') {
cur[count] = 0;
dfs(s, count + 1, index + 1);
}
// 枚举每一种可能
int ip = 0;
for(int i = index; i < n; i++) {
ip = ip * 10 + (s[i] - '0');
// 如果字段符合要求,尝试这种可能
if(ip > 0 && ip <= 255) {
cur[count] = ip;
dfs(s, count + 1, i + 1);
}else {
// 如果不符合,说明这个方案不对直接回溯
break;
}
}
}
};