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。
现在,给定字符串数组queries和words,返回一个整数数组answer,
其中每个answer[i]是使得f(queries[i]) < f(W)的单词数量,其中W是words中的单词。
例如:
输入:queries = ["cbd"], words = ["zaaaz"]
输出:[1]
说明:在第一个查询中,我们有f("cbd")= 1,f("zaaaz")= 3,因此f("cbd")<f("zaaaz")。
输入:queries = ["bbb","cc"], words = ["a","aa","aaa","aaaa"]
输出:[1,2]
说明:在第一个查询中,仅f("bbb")<f("aaaa"),所以answer[0] = 1。
在第二个查询中,f("cc")<f("aaa"),f("cc")<f("aaaa"),所以answer[1] = 2。
注意:
- 1 <= 
queries.length<= 2000 - 1 <= 
words.length<= 2000 - 1 <= 
queries[i].length,words[i].length<= 10 queries[i][j],words[i][j]是英文小写字母。
第一种解法
题目的意思是要求在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<len; i++) {
		int query = minFrequency(queries[i]);
		int count = 0;
		for (int j=0; j<len2; j++) {
			int word = minFrequency(words[j]);
			if (query < word) {
				count++;
			}
		}
		result[i] = count;
	}
	return result;
}
/**
 * 找到字符串中的最小字符的出现次数
 * @param s
 * @return
 */
public int minFrequency(String s) {
	int[] arr = new int[26];
	int count = 0;
	for (int i=0; i<s.length(); i++) {
		arr[s.charAt(i)-'a']++;
	}
	for (int j=0; j<26; j++) {
		if (arr[j] != 0) {
			count = arr[j];
			break;
		}
	}
	return count;
}
第二种解法
针对第一种解法中,在内层循环多次计算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<len2; j++) {
		wordFreq[j] = minFrequency(words[j]);
	}
	int[] result = new int[len];
	for (int i=0; i<len; i++) {
		int query = minFrequency(queries[i]);
		int count = 0;
		for (int j=0; j<len2; j++) {
			if (query < wordFreq[j]) {
				count++;
			}
		}
		result[i] = count;
	}
	return result;
}
/**
 * 找到字符串中的最小字符的出现次数
 * @param s
 * @return
 */
public int minFrequency(String s) {
	int[] arr = new int[26];
	int count = 0;
	for (int i=0; i<s.length(); i++) {
		arr[s.charAt(i)-'a']++;
	}
	for (int j=0; j<26; j++) {
		if (arr[j] != 0) {
			count = arr[j];
			break;
		}
	}
	return count;
}
第三种解法
对于前面两种解法,我们还能再简化下吗?比如,将两层循环变成一层循环?要想变一层循环,那么在计算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<len; i++) {
		result[i] = sum[minFrequency(queries[i])];
	}
	return result;
}
/**
 * 找到字符串中的最小字符的出现次数
 * @param s
 * @return
 */
public int minFrequency(String s) {
	int[] arr = new int[26];
	int count = 0;
	for (int i=0; i<s.length(); i++) {
		arr[s.charAt(i)-'a']++;
	}
	for (int j=0; j<26; j++) {
		if (arr[j] != 0) {
			count = arr[j];
			break;
		}
	}
	return count;
}
小结
算法专题目前已更新LeetCode算法题文章269+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode.1170-比较字符串中最小字符的出现频率(Compare Strings by Frequency of the Smallest Char)的更多相关文章
- 【Leetcode_easy】1170. Compare Strings by Frequency of the Smallest Character
		
problem 1170. Compare Strings by Frequency of the Smallest Character 参考 1. Leetcode_easy_1170. Compa ...
 - 【LeetCode】1170. Compare Strings by Frequency of the Smallest Character 解题报告(C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 日期 题目地址:https://leetc ...
 - 【leetcode】1170. Compare Strings by Frequency of the Smallest Character
		
题目如下: Let's define a function f(s) over a non-empty string s, which calculates the frequency of the ...
 - [LC] 1170. Compare Strings by Frequency of the Smallest Character
		
Let's define a function f(s) over a non-empty string s, which calculates the frequency of the smalle ...
 - leetCode 题解之字符串中第一个不重复出现的字符
		
1.题目描述 Given a string, find the first non-repeating character in it and return it's index. If it doe ...
 - C#版(击败97.76%的提交) - Leetcode 557. 反转字符串中的单词 III - 题解
		
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
 - leetcode python反转字符串中的单词
		
# Leetcode 557 反转字符串中的单词III### 题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. **示例1:** 输入: "L ...
 - Python2.7.3移除字符串中重复字符(一)
		
移除重复字符很简单,这里是最笨,也是最简单的一种.问题关键是理解排序的意义: # coding=utf-8 #learning at jeapedu in 2013/10/26 #移除给定字符串中重复 ...
 - Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例
		
1. 首先我们看看统计字符串中每个字符出现的次数的案例图解: 2. 代码实现: (1)需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5) ...
 
随机推荐
- nginx之location模式
			
这篇博客写的很nice, 转载: https://www.jianshu.com/p/e154c2ef002f 简单记一下: 匹配语法: = ^~ ~(区分大小写) ~*(不区 ...
 - 通俗理解数字签名,ssl数字证书和https
			
前言 最近在开发关于PDF合同文档电子签章的功能,大概意思就是在一份PDF合同上签名,盖章,使其具有法律效应.签章有法律效应必须满足两个条件: 能够证明签名,盖章者是谁,无法抵赖 PDF合同在签章后不 ...
 - 第一次尝试学习java    安装jdk   与配置环境变量  写第一个java程序  并运行
			
第一次学习java,今天知道了java之父叫 詹姆斯.高司令 其它的记不住太多,首先我们先来安装jdk 百度搜索jdk12 (现在的jdk为12版本)安装稳定版 找到javaSE12X.. 下 ...
 - SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xce in position 0: invalid continuatio
			
点击 文档>>设置文件编码>>Unicode>>Unicode(UTF-8)
 - ARTS打卡计划第八周
			
Algorithms: https://leetcode-cn.com/problems/repeated-substring-pattern/ 重复子字符串 Review: “I’m Leavin ...
 - mac安装genymotion遇到的问题记录
			
1.出错内容:An error occured while deploying the file或者使用adb devices连接的时候出现下面的错误 adb server version (40) ...
 - Leetcode题目56.合并区间(中等)
			
题目描述: 给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 ...
 - 【零基础】搞懂GPU为什么比CPU“快”
			
一.前言 近几年深度学习在各领域大显神威,而”GPU加速"也得到了越来越多的篇幅,似乎任何程序只要放到GPU上运行那速度就是杠杠的.GPU代替CPU计算已成了大势所趋?我先告诉你结论”那是不 ...
 - LeetCode 131. 分割回文串(Palindrome Partitioning)
			
题目描述 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa" ...
 - docker 用nginx 部署 node应用
			
1.查询镜像 # 1.查询镜像. docker search nginx 2.拉取指定的镜像 # 2.拉取指定的镜像 docker pull nginx 3.下载完成后终端查看 # 3.下载完成后终 ...