leetcode 第 313 场周赛题解

115 篇文章 3 订阅
35 篇文章 3 订阅

LeetCode 2427. 公因子的数目

枚举即可

class Solution {
public:
    int commonFactors(int a, int b) {
        int res=0;
        for(int i=1;i<=min(a,b);i++)
        {
            if(a%i==0&&b%i==0)res++;
        }
        return res;
    }
};

LeetCode 2428. 沙漏的最大总和

枚举

class Solution {
public:
    int maxSum(vector<vector<int>>& g) {
        int n=g.size(),m=g[0].size();
        int res=0;
        for(int i=0;i+2<n;i+=1)
        {
            for(int j=0;j+2<m;j+=1)
            {
                int sum=0;
                sum+=g[i][j]+g[i][j+1]+g[i][j+2]+g[i+1][j+1]+g[i+2][j]+g[i+2][j+1]+g[i+2][j+2];
                res=max(res,sum);
            }
        }
        return res;
    }
};

LeetCode 2429. 最小 XOR

先求出num2的置位数,由于要求最小的(x^num1),所以x的高位1尽量与num1的高位1一致,如果还有剩余的1,则从右往左将x的0变成1

class Solution {
public:
    int get(int x)
    {
        int res=0;
        while(x)
        {
            if(x&1)res++;
            x>>=1;
        }
        return res;
    }
    int minimizeXor(int num1, int num2) {
        int n=get(num2);
        int m=get(num1);
        if(n==m)return num1;
        int x=num2;
        int cnt=0;
        while(x)x/=2,cnt++;
        vector<int>v,res;
        while(num1)v.push_back(num1%2),num1/=2;
        int sz=v.size();
        for(int i=sz;i<cnt;i++)v.push_back(0);
        reverse(v.begin(),v.end());
        for(auto &x:v)
            if(x==1&&n)res.push_back(1),n--;
            else res.push_back(0);
        if(n)
        {
            reverse(res.begin(),res.end());
            for(auto &x:res)
                if(x==0&&n)n--,x=1;
            reverse(res.begin(),res.end());
        }
        for(auto x:res)n=n*2+x;
        return n;
    }
};

LeetCode 2430. 对字母串可执行的最大删除数

字符串哈希+记忆化搜索

typedef unsigned long long ull;
const int base=131;
class Solution {
public:
    vector<ull>h,p;
    ull get(string &s,int l,int r)
    {
        return h[r]-h[l-1]*p[r-l+1];
    }
    int dfs(int l,string &s,vector<int>&dp)
    {
        if(l==s.size())return 0;
        if(dp[l]!=-1)return dp[l];
        int cnt=1;
        for(int i=l;i<s.size();i++)
        {
            int r=i,len=r-l+1;
            if(get(s,l,r)==get(s,r+1,r+len))
                cnt=max(cnt,dfs(r+1,s,dp)+1);
        }
        dp[l]=cnt;
        return cnt;
    }
    int deleteString(string s) {
        int n=s.size();
        h.resize(50010),p.resize(50010);
        vector<int>dp(50010,-1);
        s=" "+s;
        p[0]=1;
        for(int i=1;i<=n;i++)
        {
            h[i]=h[i-1]*base+s[i];
            p[i]=p[i-1]*base;
        }
        return dfs(1,s,dp);
    }
};

字符串哈希+dp
dp[i]表示从i开始删除字符串所需要的最大步数
初始化dp[n]=1
状态转移:dp[i]=max(dp[i],dp[i+j]+1);(lcp)

typedef unsigned long long ull;
const int base=131;
class Solution {
public:
    vector<ull>h,p;
    ull get(string &s,int l,int r)
    {
        return h[r]-h[l-1]*p[r-l+1];
    }
    int deleteString(string s) {
        int n=s.size();
        h.resize(n+2),p.resize(n+2);
        vector<int>dp(n+2,-1);
        s=" "+s;
        p[0]=1;
        for(int i=1;i<=n;i++)
        {
            h[i]=h[i-1]*base+s[i];
            p[i]=p[i-1]*base;
        }
        for(int i=n;i;i--)
        {
            dp[i]=1;
            for(int j=1;j<=(n-i+1)/2;j++)
            {
                if(get(s,i,i+j-1)==get(s,i+j,i+j*2-1))dp[i]=max(dp[i],dp[i+j]+1);
            }
        }
        return dp[1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leimingzeOuO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值