1. 问题描述:
假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。
示例 1:
输入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"]
输出: ["Shogun"]
解释: 他们唯一共同喜爱的餐厅是“Shogun”。
示例 2:
输入:
["Shogun", "Tapioca Express", "Burger King", "KFC"]
["KFC", "Shogun", "Burger King"]
输出: ["Shogun"]
解释: 他们共同喜爱且具有最小索引和的餐厅是“Shogun”,它有最小的索引和1(0+1)。
提示:
两个列表的长度范围都在 [1, 1000]内。
两个列表中的字符串的长度将在[1,30]的范围内。
下标从0开始,到列表的长度减1。
两个列表都没有重复的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-index-sum-of-two-lists
2. 思路分析:
分析题目可以知道我们首先需要找到在list1和list2同时出现的字符串,判断字符串是否存在一个集合或者列表可以使用哈希表来判断,我们可以先扫描一遍list1,将list1中的所有字符串出现的位置都记录在哈希表中,然后遍历一下list2,判断当前遍历的字符串是否存在哈希表中,如果存在说明当前的字符串是同时存在list1和list2中,并且我们需要一个变量count来维护当前索引之和的最小值,变量res来记录答案,当我们找到同时在list1和list中存在的字符串的时候,判断当前字符串的索引之和是否小于之前的索引之和,如果小于那么更新res和count,如果相等说明需要将当前字符串添加到答案中。主要使用到了哈希表的映射功能,判断元素是否存在于某个集合中。
3. 代码如下:
from typing import List
import collections
class Solution:
# 哈希表
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
dic = collections.defaultdict(int)
for i in range(len(list1)):
# 因为使用的collections.defaultdict的字典所以将下标映射为i + 1这样可以避免后面判断dic[s] > 0中下标为0的字符串也满足的情况
dic[list1[i]] = i + 1
count = 10 ** 9
res = list()
for i in range(len(list2)):
s = list2[i]
# 当前字符串在list1和list2都存在
if dic[s] > 0:
t = i + dic[s] - 1
if t < count:
res = [s]
count = t
elif t == count:
res.append(s)
return res