2023-2-13 刷题情况

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

替换子串得到平衡字符串

题目描述

有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。

假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。

给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。

你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。

请返回待替换子串的最小可能长度。

如果原字符串自身就是一个平衡字符串,则返回 0。

样例

样例输入

s = “QWER”
s = “QQWE”
s = “QQQW”
s = “QQQQ”

样例输出

0 s 已经是平衡的了。
1 我们需要把一个 ‘Q’ 替换成 ‘R’,这样得到的 “RQWE” (或 “QRWE”) 是平衡的。
2 我们可以把前面的 “QQ” 替换成 “ER”。
3 我们可以替换后 3 个 ‘Q’,使 s = “QWER”。

提示

  • 1 < = s . l e n g t h < = 1 0 5 1 <= s.length <= 10^5 1<=s.length<=105
  • s.length 是 4 的倍数
  • s 中只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符

思路

n的范围为1e5,需要设计的算法的时间复杂度不能大于 O ( n 2 ) O(n^2) O(n2)。测试用例有点怪。题目理解起来比较麻烦。
看了题解。使用的是双指针。

代码实现

class Solution {
    public int balancedString(String s) {
        int len = s.length();
        int standard = len / 4;
        int[] arr = new int['Z'];
        for(int i = 0; i < len; i++) arr[s.charAt(i)]++;
        if(arr['Q'] == standard && arr['W'] == standard && arr['E'] == standard && arr['R'] == standard) return 0;
        int ans = len;
        for(int left = 0, right = 0; right < len; right++){
            --arr[s.charAt(right)];
            while(arr['Q'] <= standard && arr['W'] <= standard && arr['E'] <= standard && arr['R'] <= standard){
                ans = Math.min(ans, right - left + 1);
                ++arr[s.charAt(left++)];
            }
        }
        return ans;
    }
}

课程表

题目描述

你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。

例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

样例

样例输入

numCourses = 2, prerequisites = [[1,0]]
numCourses = 2, prerequisites = [[1,0],[0,1]]

样例输出

true 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
false 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

提示

  • 1 < = n u m C o u r s e s < = 1 0 5 1 <= numCourses <= 10^5 1<=numCourses<=105
  • 0 <= prerequisites.length <= 5000
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • prerequisites[i] 中的所有课程对 互不相同

思路

拓扑排序,刚好想写一些拓扑排序的题目,这题应该就是拓扑排序的基本。给出每个点的入度,只需返回能否完成拓扑排序(即图中是否存在自环)。dfs、bfs均可使用。

代码实现

dfs

class Solution {
    List<List<Integer>> edges;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges = new ArrayList<>();
        int[] vis = new int[numCourses];
        for(int i = 0; i < numCourses; i++) edges.add(new ArrayList<>());
        for(int[] cur : prerequisites)  
            edges.get(cur[1]).add(cur[0]);
        for(int i = 0; i < numCourses; i++)
            if(!dfs(vis, i)) return false;
        return true;
    }
	
	// vis状态为1表示当此进行dfs时已经遍历过,再次遇到属于环。即不满足拓扑排序;
	// vis状态为-1表示之前dfs已经遍历过当前结点,相当于给dfs剪枝吧。
    private boolean dfs(int[] vis, int index){
        if(vis[index] == 1) return false;
        if(vis[index] == -1) return true;
        vis[index] = 1;
        for(int i : edges.get(index)){
            if(!dfs(vis, i)) return false;
        }
        vis[index] = -1;
        return true;
    }
}

bfs文章来源地址https://www.toymoban.com/news/detail-417924.html

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] out = new int[numCourses];
        List<List<Integer>> edges = new ArrayList<>();
        for(int i = 0; i < numCourses; i++) edges.add(new ArrayList<Integer>());
        Queue<Integer> queue = new ArrayDeque<>();
        for(int[] prerequisit : prerequisites){
            out[prerequisit[0]]++;
            edges.get(prerequisit[1]).add(prerequisit[0]);
        }
        for(int i = 0; i < numCourses; i++) 
            if(out[i] == 0) queue.offer(i);
        
        while(!queue.isEmpty()){
            int pre = queue.poll();
            numCourses--;
            for(int cur : edges.get(pre)){
                if(--out[cur] == 0) queue.offer(cur);
            }
        }
        return numCourses == 0;
    }
}

到了这里,关于2023-2-13 刷题情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++string类replace()函数(替换字符串中的子串)

    C++中的string类提供了replace()函数,用于替换字符串中的子串。其函数原型如下: 其中,pos表示要替换的子串在原字符串中的起始位置,len表示要替换的子串的长度,str表示用来替换的字符串。 replace()函数的使用方法非常简单,只需要传入要替换的子串的位置、长度和替换字

    2024年02月05日
    浏览(40)
  • LeetCode 刷题 3. 无重复字符的最长子串

    给定一个字符串s,找出其中不包含重复字符的最长子串。 示例 1: 示例 2: 示例 3: 提示: 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 LeetCode官方详细解答

    2024年02月10日
    浏览(40)
  • 【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C

    注意:list可以是含有 空格 或者是 换行 的字串。 换行:则可以读取遍历一个文件;或者命令输出时,带有换行 空格:则可以构成一个数组,或者就是字串   2.1. 循环字串   2.2. 展开或命令替换:数字循环 连续数字相加   从1开始步长为2计算和,即计算1到100的奇数和   2.

    2023年04月08日
    浏览(32)
  • LeetCode刷题 | 647. 回文子串、516. 最长回文子序列

    给你一个字符串  s  ,请你统计并返回这个字符串中  回文子串  的数目。 回文字符串  是正着读和倒过来读一样的字符串。 子字符串  是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

    2024年02月12日
    浏览(34)
  • 力扣题库刷题笔记5--最长回文子串

    1、题目如下: 2、个人Python代码实现:         首先想到的是通过类似冒泡排序的方式进行切片,然后判断切片的子字符串是否为回文字符串,然后记录出最长的回文字符串,代码如下:         可以看到,通过切片的方式,在字符串长度只有1的时候,会报错。当然,这里

    2024年02月09日
    浏览(47)
  • 算法刷题|647.回文子串、516.最长回文子序列

    题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 d

    2024年02月17日
    浏览(37)
  • 算法刷题Day 27 组合总和+组合总和II+分割回文子串

    本题的特点是元素为可重复选取的 其实只要在原来的基础上添加一点小小的变化就是实现重复选取(与排列区别开),一时没想出来 这里与39.组合总和 (opens new window)最大的不同就是要去重了。 前面我们提到:要去重的是“同一树层上的使用过”,如何判断同一树层上元素(

    2024年02月14日
    浏览(29)
  • 刷题笔记之七(统计每个月兔子的总数+汽水瓶+查找两个字符串a,b中的最长公共子串+公共子串计算)

    目录 1. 数据库中,count不会返回null值,max和concat可能会返回null值 2. 数据库特点: 共享性高,冗余度小,安全性强,独立性强 3.  top是sql server中的,用于求前n条数据 4. 数据库使用函数进行全部扫描(数据遍历)最慢,并且函数执行本身也是需要耗时的 5.  使用%作为

    2023年04月09日
    浏览(34)
  • 力扣刷题篇之《空白替换》

    ❤️ 铁汁们大家好,欢迎大家来到出小月的博客里,今天小月呢写了一道题目叫替换空格,但是呢,写完之后调试了半天不知道哪里错了,经过小月的坚持不懈,终于成功,来分享给大家小月的错误,希望大家看完我这篇文章都能够“涨芝士”,感觉小月写的还不错的话,记

    2023年04月26日
    浏览(74)
  • 算法刷题Day 17 平衡二叉树+二叉树的所有路径+左叶子之和

    计算左右两棵子树的高度,如果有一个高度是-1(有一棵子树不平衡),直接返回-1,否则计算高度差,判断是否不平衡 使用 回溯 的方法,每次处理一个节点之前要把它push进table里,处理完之后又要把它pop出来 处理一个节点时,要判断它是否是左节点(需要父节点,可以通

    2024年02月15日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包