第 107 场LeetCode双周赛

这篇具有很好参考价值的文章主要介绍了第 107 场LeetCode双周赛。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

A 最大字符串配对数目

第 107 场LeetCode双周赛
第 107 场LeetCode双周赛
显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的.

class Solution {
public:
    int maximumNumberOfStringPairs(vector<string> &words) {
        int res = 0;        
        while (words.size() > 1) {
            auto &s = words.back();
            reverse(s.begin(), s.end());
            for (int i = words.size() - 2; i >= 0; i--)
                if (s == words[i]) {
                    res++;
                    break;
                }
            words.pop_back();
        }
        return res;
    }
};

B 构造最长的新字符串

第 107 场LeetCode双周赛

记忆化搜索: 定义状态 p a a , b b , a b , l a s t p_{aa,bb,ab,last} paa,bb,ab,last为剩余三种字符串分别为aa、bb、ab个, 且上一位为last(1代表’A’, 2代表’B’)情况下, 后面可以生成的最长字符串的长度, 枚举可用的三种字符串即可.

class Solution {
public:
    int longestString(int x, int y, int z) {
        int p[x + 1][y + 1][z + 1][3];
        memset(p, -1, sizeof(p));
        function<int(int, int, int, int)> get = [&](int aa, int bb, int ab, int last) {//last: 1->A  2->B
            if (p[aa][bb][ab][last] != -1)
                return p[aa][bb][ab][last];
            p[aa][bb][ab][last] = 0;
            if (aa && last != 1)
                p[aa][bb][ab][last] = max(p[aa][bb][ab][last], 2 + get(aa - 1, bb, ab, 1));
            if (bb && last != 2)
                p[aa][bb][ab][last] = max(p[aa][bb][ab][last], 2 + get(aa, bb - 1, ab, 2));
            if (ab && last != 1)
                p[aa][bb][ab][last] = max(p[aa][bb][ab][last], 2 + get(aa, bb, ab - 1, 2));
            return p[aa][bb][ab][last];
        };
        return get(x, y, z, 0);// last!=1,2 (初始情况没有上一位)
    }
};

C 字符串连接删减字母

第 107 场LeetCode双周赛
第 107 场LeetCode双周赛

动态规划: 定义 p i , f r o n t , b a c k p_{i,front,back} pi,front,back为生成的首位为 f r o n t front front末位为 b a c k back back s t r i str_i stri的最长长度, 若 p i , f r o n t , b a c k p_{i,front,back} pi,front,back状态是可达的, 有两种方式对 p i + 1 , f o n t ′ , b a c k ′ p_{i+1,font',back'} pi+1,font,back进行更新(对应题中两种操作).

class Solution {
public:
    int minimizeConcatenatedLength(vector<string> &li) {
        int n = li.size();
        int p[n][26][26];//i,front,back
        for (int i = 0; i < n; i++)
            for (int j = 0; j < 26; j++)
                for (int k = 0; k < 26; k++)
                    p[i][j][k] = INT32_MAX;// 标志状态不可达
        p[0][li[0][0] - 'a'][li[0].back() - 'a'] = li[0].size();
        for (int i = 1; i <= n - 1; i++) {
            for (int front = 0; front < 26; front++) {
                for (int back = 0; back < 26; back++)
                    if (p[i - 1][front][back] != INT32_MAX) {
                        p[i][front][li[i].back() - 'a'] = min(p[i][front][li[i].back() - 'a'], p[i - 1][front][back] + (int) (li[i][0] - 'a' == back ? li[i].size() - 1 : li[i].size()));// join(str_(i-1) , li[i])
                        p[i][li[i][0] - 'a'][back] = min(p[i][li[i][0] - 'a'][back], p[i - 1][front][back] + (int) (li[i].back() - 'a' == front ? li[i].size() - 1 : li[i].size())); //join(li[i], str_(i-1))
                    }
            }
        }
        int res = INT32_MAX;
        for (int front = 0; front < 26; front++)
            for (int back = 0; back < 26; back++)
                res = min(res, p[n - 1][front][back]);
        return res;
    }
};

D 统计没有收到请求的服务器数目

第 107 场LeetCode双周赛
第 107 场LeetCode双周赛

离线查询+双指针: 把日志和查询放在一个有序表 l i li li中, 并按时间非降序排序, 同时保证相同时间的日志在查询之前. 之后用双指针的方法维护 l i li li中一段时间差最大为x的区间, 及该区间上不同的服务器个数为 c n t cnt cnt, 每次移动右指针遇到是查询时, 更新左指针, 对应查询的答案即为 n − c n t n-cnt ncnt.文章来源地址https://www.toymoban.com/news/detail-500858.html

class Solution {
public:
    vector<int> countServers(int n, vector<vector<int>> &logs, int x, vector<int> &queries) {
        vector<tuple<int, int, int>> li;// time, type(0:log ,1: query), server_id/query_index
        for (auto &i: logs)
            li.emplace_back(i[1], 0, i[0]);// time, type, server_id
        int m = queries.size();
        for (int i = 0; i < m; i++)
            li.emplace_back(queries[i], 1, i);// time, type, query_index
        sort(li.begin(), li.end());
        unordered_map<int, int> cnt_server;//cnt_server[i] 服务器i当前出现次数
        int cnt = 0;
        vector<int> res(m);
        for (int l = 0, r = 0; r < li.size(); r++) {//遍历li[r]
            if (get<1>(li[r]) == 0) {//log
                int server_id = get<2>(li[r]);
                if (cnt_server[server_id]++ == 0)
                    cnt++;
            } else {//query
                int time_cur = get<0>(li[r]), query_index = get<2>(li[r]);
                for (; get<0>(li[l]) < time_cur - x; l++) {//更新l
                    if (get<1>(li[l]) == 0) {//log
                        if (--cnt_server[get<2>(li[l])] == 0)// 维护cnt_server
                            cnt--;
                    }
                }
                res[query_index] = n - cnt;
            }
        }
        return res;
    }
};

到了这里,关于第 107 场LeetCode双周赛的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第 107 场LeetCode双周赛

    A 最大字符串配对数目 显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的. B 构造最长的新字符串 记忆化搜索: 定义状态 p a a , b b , a b , l a s t p_{aa,bb,ab,last} p aa , bb , ab , l a s t ​ 为剩余三种字符串分别为aa、

    2024年02月11日
    浏览(40)
  • ​LeetCode解法汇总2496. 数组中字符串的最大值

    https://github.com/September26/java-algorithms 一个由字母和数字组成的字符串的  值  定义如下: 如果字符串  只  包含数字,那么值为该字符串在  10  进制下的所表示的数字。 否则,值为字符串的  长度  。 给你一个字符串数组  strs  ,每个字符串都只由字母和数字组成,请你

    2024年02月10日
    浏览(105)
  • 小白水平理解面试经典题目LeetCode 594 最大和谐字符串

    这道题属于字符串类型题目,解决的办法还是有很多的,暴力算法,二分法,双指针等等。 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个

    2024年01月23日
    浏览(47)
  • 【Py/Java/C++三种语言详解】LeetCode每日一题240117【哈希集合】LeetCode2744、最大字符串匹配数目

    LeetCode2744、最大字符串匹配数目 给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。 如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配: 字符串 words[i] 等于 words[j] 的反转字符串。 0 = i j words.length 请你返回数组 words 中的 最大 匹配数

    2024年01月18日
    浏览(55)
  • 【LeetCode题解】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)+2085. 统计出现过一次的公共字符串(哈希表)+2807. 在链表中插入最大公约数

    2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数 方法二

    2024年04月12日
    浏览(63)
  • leetcode刷题(字符串相加、包含每个查询的最小区间、模拟行走机器人、环形子数组的最大和、满足不等式的最大值、四数之和、树中距离之和)

    目录 1、字符串相加 2、包含每个查询的最小区间 3、模拟行走机器人 4、环形子数组的最大和 5、满足不等式的最大值 6、四数之和 7、 树中距离之和

    2024年02月10日
    浏览(45)
  • [LeetCode周赛复盘] 第 102 场双周赛20230415

    T4卡了半小时,真的不应该。 T1 模拟。 T2 前缀和模拟。 T3 分层遍历。 T4 floyd/dij(我觉得dij不是正解)。 链接: 6333. 查询网格图中每一列的宽度 1. 题目描述 2. 思路分析 按题意模拟即可。 3. 代码实现 链接: 6334. 一个数组所有前缀的分数 1. 题目描述 2. 思路分析 不要被题目的一堆

    2023年04月16日
    浏览(42)
  • [LeetCode周赛复盘] 第 111 场双周赛20230819

    T1 对向双指针。 T2 子序列/同向双指针。 T3 LIS/状态DP。 T4 数位DP。 2824. 统计和小于目标的下标对数目 1. 题目描述 2. 思路分析 类似两数之和,由于顺序无关,把数据排序。 设置l,r=0,n-1。 若a[l]+a[r]target,则a[l]+ 任意a[l+1…r]都target。则这r-l个数都可以和l组队。 3. 代码实现 2825

    2024年02月11日
    浏览(47)
  • leetcode第124场双周赛

    给你一个整数数组  nums  ,如果  nums   至少  包含  2  个元素,你可以执行以下操作: 选择  nums  中的前两个元素并将它们删除。 一次操作的  分数  是被删除元素的和。 在确保  所有操作分数相同  的前提下,请你求出  最多  能进行多少次操作。 请你返回按照上述

    2024年02月19日
    浏览(38)
  • LeetCode---121双周赛---数位dp

    2996. 大于等于顺序前缀和的最小缺失整数 2997. 使数组异或和等于 K 的最少操作次数 2998. 使 X 和 Y 相等的最少操作次数 2999. 统计强大整数的数目 简单的模拟题,只要按照题目的要求去写代码即可,代码如下 这题考异或的性质---相同为0,相异为1,我们只要关心nums的异或和与

    2024年01月22日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包