leetcode第 210 场周赛

100 / 4006xu-ri-dong-sheng-f 181: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; 
}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值