LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)

这是小川的第 412次更新,第 444篇原创

看题和准备

今天介绍的是 LeetCode算法题中 Easy级别的第 263题(顺位题号是 1170)。在一个非空字符串s上定义一个函数 f(s),该函数计算 s中最小字符的出现频率。例如,如果 s ="dcce",则 f(s)= 2,因为最小字符为 "c",其频率为2。

现在,给定字符串数组 querieswords,返回一个整数数组 answer
其中每个 answer[i]是使得 f(queries[i]) < f(W)的单词数量,其中 Wwords中的单词。

例如:

输入:queries = [“cbd”], words = [“zaaaz”]
输出:[1]
说明:在第一个查询中,我们有 f("cbd")= 1f("zaaaz")= 3,因此 f("cbd")<f("zaaaz")< code>&#x3002;</f("zaaaz")<>

输入:queries = [“bbb”,”cc”], words = [“a”,”aa”,”aaa”,”aaaa”]
输出:[1,2]
说明:在第一个查询中,仅 f("bbb")<f("aaaa")< code>&#xFF0C;&#x6240;&#x4EE5;<code>answer[0] = 1</code>&#x3002;<br>&#x5728;&#x7B2C;&#x4E8C;&#x4E2A;&#x67E5;&#x8BE2;&#x4E2D;&#xFF0C;<code>f("cc")<f("aaa")< code>&#xFF0C;<code>f("cc")<f("aaaa")< code>&#xFF0C;&#x6240;&#x4EE5;<code>answer[1] = 2</code>&#x3002;</f("aaaa")<></code></f("aaa")<></code></f("aaaa")<>

注意

  • 1

第一种解法

题目的意思是要求在 words中,找出最小字符出现次数小于 queries中字符串最小字符出现次数的单词个数,最后以 queries的长度作为 int数组返回。

因此,我们直接翻译题目即可,使用两层循环,外层循环遍历 queries中的字符串,找到 queries[i]中最小字符的出现次数,接着遍历 words中的单词,比较两个最小字符出现次数,如果 queries中的比较小,就计数,内层循环结束后,将计数结果添加到 answer数组中,最后返回。

public int[] numSmallerByFrequency(String[] queries, String[] words) {
    int len = queries.length, len2 = words.length;
    int[] result = new int[len];
    for (int i=0; i

第二种解法

针对第一种解法中,在内层循环多次计算 words中单词的最小字符出现次数,我们可以抽到循环外面处理。先将每个单词的最小字符出现次数都算出来,存入一个长度和 words相同的 int数组中,在内层循环中,就可以直接遍历这个 int数组了,而不用每个全部重新算一遍。

public int[] numSmallerByFrequency2(String[] queries, String[] words) {
    int len = queries.length, len2 = words.length;
    int[] wordFreq = new int[len2];
    for (int j=0; j

第三种解法

对于前面两种解法,我们还能再简化下吗?比如,将两层循环变成一层循环?要想变一层循环,那么在计算 queries中的字符串时,就需要一次拿到结果,不使用循环,也就是说像在数组中取值一样。

我们先来观察下第二个例子。在处理完 words中的单词时,会得到一个数组 wordFreq,在此基础上再做下变化,做计数处理,将最小字符出现次数作为新数组的索引,再来累计次数,就会得到下面四个:

count[4] = 1; //"aaaa"代表的单词
count[3] = 1; //"aaa"代表的单词
count[2] = 1; //"aa"代表的单词
count[1] = 1; //"a"代表的单词

再来观察下 queries数组,字符串 "bbb""cc",去和 words中的单词比较时,会有以下规律:

大于"bbb"的有1位,记为arr[3] = 1
大于"cc"的有2位,记为arr[2] = 2

如果接着往下写:

大于1的有3位,arr[1] = 3
大于0的有4位,arr[0] = 4

我们发现,以 queries中的字符串最小字符出现次数为索引的 arr数组,其实就是上面 count数组的倒序元素累加之和:

arr[3] = count[4] = 1;
arr[2] = arr[3] + count[3] = 1+1 = 2
arr[i-1] = arr[i]+count[i];

分析出来这其中的原理后,剩下就是将代码写出来了,此解法比前面两种解法速度上快很多。

public int[] numSmallerByFrequency3(String[] queries, String[] words) {
    int len = queries.length;
    int[] wordFreq = new int[11];
    for (String word : words) {
        wordFreq[minFrequency(word)]++;
    }
    int[] sum = new int[11];
    for (int i=sum.length-1; i>0; i--) {
        sum[i-1] = sum[i]+wordFreq[i];
    }
    int[] result = new int[len];
    for (int i=0; i

算法专题目前已更新 LeetCode算法题文章 269+篇,公众号对话框回复【 数据结构与算法】、【 算法】、【 数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

Original: https://www.cnblogs.com/xiaochuan94/p/11570371.html
Author: 程序员小川
Title: LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/572962/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx出现413 Request Entity Too Large问题的解决方法

    上传文件时控制台出现了413 Request Entity Too Large的问题。将Nginx中加入client_max_body_size参数并调整合适的大小(如果没有该参数…

    Java 2023年5月30日
    068
  • README

    大家好,这里主要记录一些学习经历,代码过程相关东西。 萌新码农,入职一年,啥都不会,努力学习吧 Original: https://www.cnblogs.com/mrystar/…

    Java 2023年6月8日
    067
  • 黑炫酷的监控界面,实际上是用了什么开源工具?

    我是3y,一年 CRUD经验用十年的 markdown程序员👨🏻‍💻常年被誉为职业八股文选手 今天austin项目来给大家整点不一样的:花点时间跟着文章做完,屏幕壁纸就可以有了,我…

    Java 2023年6月9日
    059
  • Intellij IDEA 显示 access.log 日志

    先配置 SpringBoot 记录 access.log 日志,先让accesslog 显示出来 Original: https://www.cnblogs.com/vipsoft…

    Java 2023年6月13日
    069
  • springboot修改打包后的项目(jar war)名称

    springboot修改打包后的项目(jar war)名称 在build里面添加inalName,指定好想要额项目名称即可: Original: https://www.cnblo…

    Java 2023年5月30日
    073
  • Java开发中关于资源路径获取问题

    描述 在开发中经常会读取配置文件,在Web开发中大多数都是在项目路径下。核心的API类或者是Controller异或是jsp页面等,基本都是基于web应用的相对路径,很少去操作绝对…

    Java 2023年6月5日
    074
  • Spring实例化bean之后的处理, 关于BeanPostProcessor接口的使用

    业务需求:缓存页面,展示需要缓存的所有对象,每类对象在字典表中有编码对应,点击某个对象可以缓存某类对象,每类对象都有自己的缓存runner(弱弱的说一句,本人看到这里的第一反应就是…

    Java 2023年6月8日
    070
  • java 反序列化 报.InvalidClassException异常

    原因是 序列化对象后 又对对象所属类文件进行了修改所以会报异常 解决方案 在对象所属类 实现Serializable接口并定义 serialVersionUID常量 private…

    Java 2023年6月7日
    090
  • Spring源码分析(一)-Spring源码编译

    1 下载源码 1.1 fork源码 由于从github网络下载太慢,就直接在gitee下载了gitee源码镜像,fork主要是为了可以添加注释 2.2 下载源码 将fork的源码c…

    Java 2023年6月8日
    078
  • Java正则表达式——matcher.find()的匹配原理

    在Java正则中,matcher.find()通过获取目的子字符串的第一元素和最后一个元素的索引来确定目的字符串,大致方法就是将获取的索引存入在类中定义好的属性groups[]中,…

    Java 2023年6月8日
    071
  • 书写高质量sql的一些建议

    It’s better to light a candle than to curse the darkness 老生常谈的不要使用 select * 如果硬要使用se…

    Java 2023年6月13日
    073
  • Spring的JDK动态代理如何实现的(源码解析)

    前言 上一篇文章中提到了SpringAOP是如何决断使用哪种动态代理方式的,本文接上文讲解SpringAOP的JDK动态代理是如何实现的。SpringAOP的实现其实也是使用了 P…

    Java 2023年6月7日
    081
  • javase集合 温故而知新

    重温javase集合 前言:1、为什么要有集合?数组长度需要在初始化时确定大小,数据结构单一、因此集合出现了 2、数组和集合的区别区别一:数组既可以存储基本数据类型,又可以存储引用…

    Java 2023年6月16日
    064
  • java学习笔记1(入门级)

    JavaSE (Java标准版) JavaEE(Java企业版) JavaME(Java微型版) 简单性:例如C++支持多继承,多继承比较复杂,而Java不在支持多继承 C++中有…

    Java 2023年6月16日
    075
  • spring框架技术方面

    一:描述spring事务的只读,超时,回滚的原则。1.spring事务的只读:“只读事务”并不是一个强制选项,它只是一个暗示,提示数据库驱动程序和数据库系统…

    Java 2023年6月5日
    074
  • LeetCode组合总和

    组合总和 前言 在上篇文章通过组合问题看透回溯法当中我们通过介绍一个组合问题,仔细地分析了组合问题的回溯过程。我们之后会继续介绍一些比较经典的回溯算法题,帮助深入彻底理解回溯算法的…

    Java 2023年6月8日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球