本文将同步发表至微信公众号Daniel谈技术,后续可能会有更新,欢迎大家关注,提出修改意见。
- 赛况
共四题,完成三题。第一题一遍过,第二题因为数组开错位置尴尬了一段时间,第三题先打了个模拟,然后突然想出正解,简单debug几次后通过。前面debug时间有点久,第四题没来得及看,于是放弃了。
- 题目
2.1 括号的最大嵌套深度
如果字符串满足一下条件之一,则可以称之为 有效括号字符串(valid parentheses string,可以简写为 VPS):
字符串是一个空字符串 “”,或者是一个不为 “(” 或 “)” 的单字符。
字符串可以写为 AB(A 与 B 字符串连接),其中 A 和 B 都是 有效括号字符串 。
字符串可以写为 (A),其中 A 是一个 有效括号字符串 。
类似地,可以定义任何有效括号字符串 S 的 嵌套深度 depth(S):
depth("") = 0
depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括号字符串
depth("(" + A + “)”) = 1 + depth(A),其中 A 是一个 有效括号字符串
例如:""、"()()"、"()(()())" 都是 有效括号字符串(嵌套深度分别为 0、1、2),而 “)(”
、"(()" 都不是 有效括号字符串 。
给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 。
示例 1:
输入:s =
“(1+(2*3)+((8)/4))+1”
输出:3
解释:数字 8 在嵌套的 3 层括号中。
示例 2:
输入:s =
“(1)+((2))+(((3)))”
输出:3
示例 3:
输入:s =
“1+(2*3)/(2-1)”
输出:1
示例 4:
输入:s =
“1”
输出:0
提示:
1 <= s.length
<= 100
s 由数字 0-9 和字符 ‘+’、’-’、’*’、’/’、’(’、’)’ 组成
题目数据保证括号表达式 s 是 有效的括号表达式
2.2 最大网络秩
n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] = [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。
两座不同城市构成的 城市对 的 网络秩 定义为:与这两座城市 直接 相连的道路总数。如果存在一条道路直接连接这两座城市,则这条道路只计算 一次 。
整个基础设施网络的 最大网络秩 是所有不同城市对中的 最大网络秩 。
给你整数 n 和数组 roads,返回整个基础设施网络的 最大网络秩 。
示例 1:
输入:n = 4, roads =
[[0,1],[0,3],[1,2],[1,3]]
输出:4
解释:城市 0 和 1 的网络秩是 4,因为共有 4 条道路与城市 0 或 1 相连。位于 0 和 1 之间的道路只计算一次。
示例 2:
输入:n = 5, roads =
[[0,1],[0,3],[1,2],[1,3],[2,3],[2,4]]
输出:5
解释:共有 5 条道路与城市 1 或 2 相连。
示例 3:
输入:n = 8, roads =
[[0,1],[1,2],[2,3],[2,4],[5,6],[5,7]]
输出:5
解释:2 和 5 的网络秩为 5,注意并非所有的城市都需要连接起来。
提示:
2 <= n <=
100
0 <=
roads.length <= n * (n - 1) / 2
roads[i].length
== 2
0 <= ai, bi <= n-1
ai != bi
每对城市之间 最多只有一条 道路相连
2.3 分割两个字符串得到回文串
给你两个字符串 a
和 b ,它们长度相同。请你选择一个下标,将两个字符串都在 相同的下标 分割开。由 a 可以得到两个字符串: aprefix 和 asuffix ,满足 a = aprefix + asuffix ,同理,由 b 可以得到两个字符串 bprefix 和 bsuffix ,满足 b = bprefix + bsuffix 。请你判断 aprefix + bsuffix 或者 bprefix + asuffix 能否构成回文串。
当你将一个字符串 s 分割成 sprefix 和 ssuffix 时, ssuffix 或者 sprefix 可以为空。比方说, s = “abc” 那么 “” + “abc” , “a” + “bc” , “ab” + “c” 和 “abc” + “” 都是合法分割。
如果 能构成回文字符串 ,那么请返回 true,否则返回 false 。
请注意, x + y 表示连接字符串 x 和 y 。
示例 1:
输入:a =
“x”, b = “y”
输出:true
解释:如果 a 或者 b 是回文串,那么答案一定为 true ,因为你可以如下分割:
aprefix = “”,
asuffix = “x”
bprefix = “”,
bsuffix = “y”
那么 aprefix + bsuffix = “”
- “y” = “y” 是回文串。
示例 2:
输入:a =
“ulacfd”, b = “jizalu”
输出:true
解释:在下标为 3 处分割:
aprefix =
“ula”, asuffix =
“cfd”
bprefix = “jiz”,
bsuffix = “alu”
那么 aprefix + bsuffix =
“ula” + “alu” = “ulaalu” 是回文串。
提示:
1 <=
a.length, b.length <= 105
a.length ==
b.length
a 和 b 都只包含小写英文字母
2.4 统计子树中城市之间最大距离(放弃)
给你 n 个城市,编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges ,其中 edges[i] = [ui, vi] 表示城市 ui 和 vi 之间有一条双向边。题目保证任意城市之间只有唯一的一条路径。换句话说,所有城市形成了一棵 树 。
一棵 子树 是城市的一个子集,且子集中任意城市之间可以通过子集中的其他城市和边到达。两个子树被认为不一样的条件是至少有一个城市在其中一棵子树中存在,但在另一棵子树中不存在。
对于 d 从 1 到 n-1 ,请你找到城市间 最大距离 恰好为 d 的所有子树数目。
请你返回一个大小为 n-1 的数组,其中第 d 个元素(下标从 1 开始)是城市间 最大距离 恰好等于 d 的子树数目。
请注意,两个城市间距离定义为它们之间需要经过的边的数目。
示例 1:
输入:n = 4, edges =
[[1,2],[2,3],[2,4]]
输出:[3,4,0]
解释:子树 {1,2}, {2,3} 和 {2,4} 最大距离都是 1 。
子树 {1,2,3},
{1,2,4}, {2,3,4} 和 {1,2,3,4} 最大距离都为 2 。
不存在城市间最大距离为 3 的子树。
示例 2:
输入:n = 2, edges =
[[1,2]]
输出:[1]
示例 3:
输入:n = 3, edges = [[1,2],[2,3]]
输出:[2,1]
提示:
2 <= n <= 15
edges.length ==
n-1
edges[i].length
== 2
1 <= ui, vi <= n
题目保证 (ui, vi) 所表示的边互不相同。
- 思路
3.1 括号的最大嵌套深度
题意大概就是求一个式子有多少层括号嵌套。
这里想到用栈的思想。每当读取到一个左括号时候深度加一,每读到一个右括号时深度减一。
此操作等价于入栈和出栈。
3.2 最大网络秩
题意大概是求任意两点总路线数目最大值。
这里采用的方法是,先读取边,存到一个一维数组中,两边各加一,即得到每一点对应的边总数。
由于可能会得到一种情况,即最大值对应的两点有一条公共边,因而额外加一个二维数组判断哪两点之间有边,如果有,那么答案减一。
最后i从0到n-2遍历各点,另一维度j从i+1遍历到N-1取最大值。
错误思想:我曾经试想sort每点边数然后取两个最大值。最大的问题在于我并不知道哪两点直接有没有边,因此有1的误差。
3.3 分割两个字符串得到回文
这道题如果用模拟,分离字符串就太麻烦了。当然,我一开始就是这么做的。
对于a和b两个字符串,在相同的位置断开,,然后重新拼接。例如原来是mn 和xy,那么拼成,my和nx。
于是从字符串a的左侧和b的右侧分别开始遍历。
同理,从字符串a右侧和b左侧开始遍历。
3.4 统计子树中城市之间最大距离(未完成,待续)
- 代码
4.1 括号的最大嵌套深度
class Solution {
public:
int maxDepth(string s) {
int left=0;
int leftmax=0;
for(int i=0;i<s.length();i++){
if(s[i]=='(')left++;
else if(s[i]==')')left--;
leftmax=(leftmax<left)?left:leftmax;
}
return leftmax;
}
};
4.2 最大网络秩
class Solution {
public://why wrong
unsigned short waymap[103][102];
int waynum[101]={0};
int maxx=0;
vector<int> each;
vector<vector<int>>::iterator iter;
int maximalNetworkRank(int n, vector<vector<int>>&
roads) {
for(iter=roads.begin();iter<roads.end();iter++){
each=*iter;
int maxn=(each[0]<each[1])?each[1]:each[0];
int minn=(each[0]>each[1])?each[1]:each[0];
waynum[minn]++;
waynum[maxn]++;
waymap[minn][maxn]=true;
waymap[maxn][minn]=true;
}
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
int ans=waynum[i]+waynum[j];
if(waymap[i][j])ans--;
maxx=(maxx>ans)?maxx:ans;
}
}
return maxx;
}
};
4.3 分割两个字符串得到回文
class Solution {
public:
string sa1,sa2,sb1,sb2;
string s1,s2;
bool checkPalindromeFormation(string a, string b) {
if(a.length()==1)return true;
int case1=0,case2=0;
for(int i=0;i<a.length();i++){
if(a[i]==b[a.length()-i-1])case1++;
else break;
}
for(int i=0;i<a.length();i++){
if(b[i]==a[a.length()-i-1])case2++;
else break;
}
return case1+case2>0;
}
};
4.4 统计子树中城市之间最大距离(未完成,待续)