LeetCode 剑指 Offer II 回溯(下) 专题总结

输入:n = 3

输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

提示:

  • 1 <= n <= 8

思路:

"("当成+1,")"当成-1,和为0且个数为2*n时即是答案

  • 加入左括号,尝试每一种可能
  • 加入右括号,尝试每一种可能

class Solution {

public:

vector ans;

string cur;

int n;

char left = ‘(’, right = ‘)’;

vector 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();

}

};

086. 分割回文子字符串

=============================================================================

题目:

给定一个字符串 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> ans;

vector cur;

int n;

vector<vector> 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;

}

};

087. 复原 IP

==========================================================================

题目:

给定一个只包含数字的字符串 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” 和 “192.168@1.1” 是 无效 IP 地址。

示例:

输入:s = “25525511135”

输出:[“255.255.11.135”,“255.255.111.35”]

提示:

  • 0 <= s.length <= 3000

  • s 仅由数字组成

最后

小编精心为大家准备了一手资料

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

1714413575995)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-dJcUI7Dr-1714413575996)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-SsQJBbbT-1714413575996)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值