一、有效的字母异位词
题目:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例1:
输入: s = "anagram", t = "nagaram"
输出: true
示例2:
输入: s = "rat", t = "car"
输出: false
说明: 你可以假设字符串只包含小写字母。
1、排序
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(s) == sorted(t)
2、常规办法:采用字典
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 法1: 字典
letter_dic = {}
for i in s:
letter_dic[i] = letter_dic.get(i,0) + 1
for j in t:
if j not in letter_dic:
return False
else:
letter_dic[j] -= 1
if letter_dic[j] == 0:
del letter_dic[j]
return letter_dic == {}
3、优化字典法:采用defaultdict
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
# 法2: defaultdict,可以指定value值的类型,如果为int类型,且会为每个key的value初始化为0
tracker = collections.defaultdict(int)
for x in s: tracker[x] += 1
for x in t: tracker[x] -= 1
# all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 True,如果是返回 True,否则返回 False。
return all(x == 0 for x in tracker.values())
# 有趣的是x == 0 for x in tracker.values()这个得到的竟然是一个生成器对象!
二、字母异位词分组
题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
dic = {}
for v in strs:
sort_v = tuple(sorted(v))
dic[sort_v] = dic.get(sort_v,[]) + [v]
return list(dic.values())
三、两数之和
两层循环,暴力法破解,不说了!
1、字典法
class Solution(object):
def twoSum(self, nums, target):
a_dic = {v:i for i, v in enumerate(nums)}
for i in range(len(nums)):
a = target - nums[i]
if a in a_dic and a_dic[a] != i:
return [a_dic[a], i]
2、字典法优化
class Solution(object):
def twoSum(self, nums, target):
# 一边遍历列表一边查字典
# 有人会疑惑,这样难道不会错过两数之和等于target的index吗?
# 不会,a + b = target,错过了a,a会被加入dic,那么b一定不会错过!
dic = {}
for i, v in enumerate(nums):
num = target - v
if num in dic:
return [i, dic[num]]
dic[v] = i
四、数组的度
class Solution:
def findShortestSubArray(self, nums: List[int]) -> int:
# 哈希表
# [0,i,0]释义:[count, start, end]
dic = {}
for i, v in enumerate(nums):
dic[v] = dic.get(v, [0,i,0])
dic[v][0] += 1
dic[v][2] = i
max_Num, min_len = 0, math.inf
for k, v in dic.items():
l = v[2] - v[1] + 1
if v[0] > max_Num:
max_Num = v[0]
min_len = l
if v[0] == max_Num and l < min_len:
min_len = l
return min_len