【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go)

这篇具有很好参考价值的文章主要介绍了【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

题意

给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。
输入:words1 = [“leetcode”,“is”,“amazing”,“as”,“is”], words2 = [“amazing”,“leetcode”,“is”]
输出:2
解释:

  • “leetcode” 在两个数组中都恰好出现一次,计入答案。
  • “amazing” 在两个数组中都恰好出现一次,计入答案。
  • “is” 在两个数组中都出现过,但在 words1 中出现了 2 次,不计入答案。
  • “as” 在 words1 中出现了一次,但是在 words2 中没有出现过,不计入答案。
    所以,有 2 个字符串在两个数组中都恰好出现了一次。
    提示:

1 < = w o r d s 1. l e n g t h , w o r d s 2. l e n g t h < = 1000 1 <= words1.length, words2.length <= 1000 1<=words1.length,words2.length<=1000
1 < = w o r d s 1 [ i ] . l e n g t h , w o r d s 2 [ j ] . l e n g t h < = 30 1 <= words1[i].length, words2[j].length <= 30 1<=words1[i].length,words2[j].length<=30
w o r d s 1 [ i ] words1[i] words1[i] w o r d s 2 [ j ] words2[j] words2[j] 都只包含小写英文字母。

思路1

  • 用哈希表mp1来统计word1中每个字符串的出现次数
  • 用哈希表mp2来统计word2中每个字符串的出现次数
  • 遍历哈希表mp1,判断它在word1,word2中的出现次数是否都是1,如果都是1的话,记录答案
  • 时间复杂度为 O ( n + m ) O(n+m) O(n+m),空间复杂度为 O ( n + m ) O(n+m) O(n+m),其中 n n nword1里所有字符串的长度和, m m mword2里所有字符串的长度和

代码1

golang版本代码

【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go),力扣,leetcode,散列表,c++

func countWords(words1 []string, words2 []string) int {
	mp1 := make(map[string]int, len(words1))
	mp2 := make(map[string]int, len(words2))
	for _, word := range words1 {
		mp1[word]++
	}
	for _, word := range words2 {
		mp2[word]++
	}
	var ans = 0
	for k, v := range mp1 {
		if v != 1 {
			continue
		}
		if cnt, ok := mp2[k]; ok && cnt == 1 {
			ans++
		}
	}
	return ans
}

c++版本代码

【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go),力扣,leetcode,散列表,c++

class Solution {
	public:
		int countWords(vector<string>& words1, vector<string>& words2) {
			map<string,int>mp1,mp2;
			for(auto word:words1) {
				mp1[word]++;
			}
			for(auto word:words2) {
				mp2[word]++;
			}
			int ans = 0;
			for(auto it:mp1) {
				if (it.second == 1 && mp2[it.first] == 1) {
					ans++;
				}
			}
			return ans;
		}
};

思路2

  • 基于思路1的基础上,考虑能否只用一个哈希表完成题目
  • 先用哈希表mp来统计word1中每个字符串的出现次数
  • 遍历word2的字符串word,对mp[word]的情况进行讨论
    • mp[word]=1 说明wordword1里出现了一次,更新答案,且将mp[word]赋值为一个特殊的数字,这里赋值为-1
    • mp[word]=-1说明wordword2里已经出现了一次,当前是第二次,更新答案(这里是ans--,因为word已经不符合条件了),且将mp[word]赋值为正常的计数2
  • 看了下运行截图还是优化了下空间的

代码2

golang版本代码

【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go),力扣,leetcode,散列表,c++

func countWords(words1 []string, words2 []string) int {
	mp := make(map[string]int, len(words1))
	for _, word := range words1 {
		mp[word]++
	}
	var ans = 0
	for _, word := range words2 {
		switch mp[word] {
		case 1:
			ans++
			mp[word] = -1
		case -1:
			ans--
			mp[word] = 2
		}
	}
	return ans
}

c++版本代码

【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go),力扣,leetcode,散列表,c++文章来源地址https://www.toymoban.com/news/detail-812614.html

class Solution {
	public:
		int countWords(vector<string>& words1, vector<string>& words2) {
			map<string,int>mp;
			for(auto word:words1) {
				mp[word]++;
			}
            int ans = 0;
			for(auto word:words2) {
				if(mp[word]==1) {
					mp[word] = -1;
					ans ++;
				} else if(mp[word]==-1) {
					mp[word] = 2;
					ans --;
				}
			}
			return ans;
		}
};

到了这里,关于【力扣·每日一题】2085.统计出现过一次的公共字符串(模拟 哈希表 优化 C++ Go)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 每日一题——只出现一次的数字

    每日一题——只出现一次的数字

    题目链接 要求为线性时间复杂度,即 时间复杂度为O(n) ,那么我们就不能用简单的两层循环来解决问题 要求只能使用常量额外空间,即 空间复杂度为O(1) ,那么我们就不能额外开辟一个数组来记录每个元素出现的次数 这里,给大家介绍一个全新的方法:位运算——异或^ 注

    2024年02月15日
    浏览(9)
  • 2023年7月3日leetcode每日一题打卡——136.只出现一次的数字

    136. 只出现一次的数字 - 力扣(LeetCode) 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现 线性时间复杂度 的算法来解决此问题,且该算法 只使用常量额外空间 。 示例1: 示例2: 示

    2024年02月12日
    浏览(12)
  • 【LeetCode】每日一题&最后一个单词的长度&投票法求解多数元素&异或操作符巧解只出现一次的数字&整数反转

    ========================================================================= 个人主页直达: 小白不是程序媛 LeetCode系列专栏: LeetCode刷题掉发记 ========================================================================= 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数

    2024年02月08日
    浏览(12)
  • 只出现一次的数字——力扣136

    只出现一次的数字——力扣136

    2024年02月11日
    浏览(10)
  • 力扣(LeetCode)算法_C++—— 只出现一次的数字

    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例 1 : 输入:nums = [2,2,1] 输出:1 示例 2 : 输入:nums = [4,

    2024年02月09日
    浏览(10)
  • 力扣刷题SQL-619. 只出现一次的最大数字

    力扣刷题SQL-619. 只出现一次的最大数字

    MyNumbers 表: +-------------+------+ | Column Name | Type | +-------------+------+ | num         | int  | +-------------+------+ 这张表没有主键。可能包含重复数字。这张表的每一行都含有一个整数。 单一数字 是在 MyNumbers 表中只出现一次的数字。 请你编写一个 SQL 查询来报告 最大的 单一 数字

    2024年02月16日
    浏览(10)
  • Git忽略已经提交过一次的文件 Git忽略文件

    1、从未提交过的文件可以用.gitignore      也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件  该文件只能作用于未跟踪的文件(Untracked Files),也就是那些从来没有被 git 记录过的文件  比如,忽略配置文件,可以在.gitignore中写 2、已经推送(p

    2024年02月12日
    浏览(51)
  • 【力扣每日一题】2023.8.24 统计参与通信的服务器

    【力扣每日一题】2023.8.24 统计参与通信的服务器

    目录 题目: 示例: 分析: 代码: 题目顾名思义,要我们统计参与通信的服务器,给我们一个二维矩阵,元素为1的位置则表示是一台服务器。 判断一台服务器是否参与通信的条件是同一列或是同一行中也有服务器。 那么我们只需要遍历整个矩阵,遇到服务器的时候我们进

    2024年02月11日
    浏览(6)
  • 力扣每日一题--2088. 统计农场中肥沃金字塔的数目

    力扣每日一题--2088. 统计农场中肥沃金字塔的数目

    看到这道题有些人很容易放弃,其实这道题不是很难,主要是题目长,读的容易让人放弃,但是 只要抓住一些性质就可以解决该问题。     本题中的定义放到图像里其实就是个金字塔,下层的那部分比上一层的那部分,长度加2, 并且该层那个长度区间内都是1才行。是个金

    2024年01月18日
    浏览(12)
  • 只出现一次的数字

    问题: 给你一个  非空  整数数组  nums  ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 示例: 示例 1 : 示例 2 : 示例 3 : 思想: 由于

    2024年02月07日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包