100 / 4006 | xu-ri-dong-sheng-f | 18 | 1:19:04 |
lt的题比较简单,但是他这个函数提交太难调试了,大部分时间花在这里
5535. 括号的最大嵌套深度
循环搞一搞就行
class Solution {
public:
int maxDepth(string s) {
int n =s.length();
int ans=0,mx=0;
for(int i=0;i<n;i++){
if(s[i]=='(')ans++;
if(s[i]==')')ans--;
mx=max(mx,ans);
}
return mx;
}
};
5536. 最大网络秩
枚举两个点,搞一搞就行
class Solution {
public:
int head[10000+7],cnt=1;
void init(int n){cnt=1;for(int i=0;i<=n;i++)head[i]=0;}
struct EDGE{int to,nxt,w;}ee[10000*2+7];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
int maximalNetworkRank(int n, vector<vector<int>>& roads) {
for(int i=0;i<roads.size();i++){
int u=roads[i][0],v=roads[i][1];
add(u,v,0),add(v,u,0);
}
int mx=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
vector<int>tp;
int ans=0;
for(int k=head[i];k;k=ee[k].nxt)
ee[k].w=ee[k^1].w=1,tp.push_back(k),ans++;
//cout<<i<<" -- "<<j<<" = "<<ans<<endl;
for(int k=head[j];k;k=ee[k].nxt){
if(ee[k].w==0)ans++;
ee[k].w=ee[k^1].w=1,tp.push_back(k);
}
//cout<<ans<<endl;
mx=max(mx,ans);
for(auto x:tp)ee[x].w=ee[x^1].w=0;
}
return mx;
}
};
1616. 分割两个字符串得到回文串
写完马拉车后发现。。贪心搞一搞就行。。。
最后一定是 :前一部分 是a前与b后匹配,或b前与a后匹配,中间是a自身或b自身匹配
class Solution {
public:
bool checkPalindromeFormation(string a, string b) {
int na=a.length(),nb=b.length();
bool f=true;
for(int i=0;i<na;i++)if(a[i]!=a[na-i-1])f=false;
if(f)return true;
f=true;
for(int i=0;i<nb;i++)if(b[i]!=b[nb-i-1])f=false;
if(f)return true;
int op=0;bool fa=true,fb=true;
for(int i=0;i<na/2;i++){
int r=na-i-1;
//cout<<i<<" "<<a[i]<<" "<<b[r]<<" - "<<a[r]<<endl;
if(a[i]==b[r])continue;
//i->r
for(int j=i;j<=r;j++){
if(a[j]!=a[na-j-1])fa=false;
if(b[j]!=b[na-j-1])fb=false;
}
break;
}
if(fa||fb)return true;
fa=fb=true;
for(int i=0;i<na/2;i++){
int r=na-i-1;
//cout<<i<<" "<<a[i]<<" "<<b[r]<<" - "<<a[r]<<endl;
if(b[i]==a[r])continue;
//i->r
for(int j=i;j<=r;j++){
if(a[j]!=a[na-j-1])fa=false;
if(b[j]!=b[na-j-1])fb=false;
}
break;
}
if(fa||fb)return true;
return false;
}
};
5538. 统计子树中城市之间最大距离
枚举子集,然后求直径就行。。
class Solution {
public:
int head[16],cnt=1;
struct EDGE{int to,nxt,w;}ee[16*2+7];
void add(int x,int y,int w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=cnt;}
int ans[16],vs[16];
int nm,mx,p;
void dfs(int x,int fa,int dis){
nm++;
// cout<<x<<" - "<<fa<<endl;
if(dis>mx)mx=dis,p=x;
for(int i=head[x];i;i=ee[i].nxt){
int y=ee[i].to;
if(!vs[y]||y==fa)continue;//y没被选中
dfs(y,x,dis+1);
}
}
vector<int> countSubgraphsForEachDiameter(int n, vector<vector<int>>& edges) {
for(int i=0;i<n-1;i++){
int u =edges[i][0],v=edges[i][1];
// cout<<u<<" - "<<v<<endl;
add(u,v,1);add(v,u,1);
}
for(int sta=1;sta<(1<<n);sta++){
memset(vs,0,sizeof(vs));
int rt=0,tm=0;
// cout<<sta<<"- - ok"<<endl;
for(int i=1;i<=n;i++)
if(sta>>(i-1)&1)vs[i]=1,rt=i,tm++;
mx=nm=p=0;
dfs(rt,0,0);
int q=p;
if(nm!=tm)continue;//不是一个子集
mx=nm=0;
dfs(p,0,0);
// cout<<mx<<endl;
ans[mx]++;
}
vector<int>pr;
for(int i=1;i<n;i++)pr.push_back(ans[i]);
return pr;
}
};