宝石与石头
给你一个字符串 jewels
代表石头中宝石的类型,另有一个字符串 stones
代表你拥有的石头。 stones
中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小写,因此 "a"
和 "A"
是不同类型的石头。
示例:
输入:jewels = "aA", stones = "aAAbbbb"
输出:3
输入:jewels = "z", stones = "ZZ"
输出:0
提示:
1 <= jewels.length, stones.length <= 50
jewels
和stones
仅由英文字母组成jewels
中的所有字符都是 唯一的
思路:目的就是看看stones中有几个jewels的字符,为了避免重复遍历jewels字符串,可以将jewels字符串变为哈希表,遍历stones,时间复杂度为O(m+n)。代码如下:
class Solution:
def numJewelsInStones(self, jewels: str, stones: str) -> int:
jewels = set(jewels)
count = 0
for ch in stones:
if ch in jewels:
count += 1
return count
子域名访问计数
网站域名 "discuss.leetcode.com
" 由多个子域名组成。顶级域名为 "com
" ,二级域名为 "leetcode.com"
,最低一级为"discuss.leetcode.com"
。当访问域名 "discuss.leetcode.com"
时,同时也会隐式访问其父域名"leetcode.com"
以及 "com
" 。计数配对域名 是遵循 "rep d1.d2.d3
" 或 "rep d1.d2
" 格式的一个域名表示,其中 rep 表示访问域名的次数,d1.d2.d3
为域名本身。例如,"9001 discuss.leetcode.com
" 就是一个 计数配对域名 ,表示 discuss.leetcode.com
被访问了 9001 次。给你一个 计数配对域名 组成的数组 cpdomains
,解析得到输入中每个子域名对应的 计数配对域名 ,并以数组形式返回。可以按 任意顺序 返回答案。
示例:
输入:cpdomains = ["9001 discuss.leetcode.com"]
输出:["9001 leetcode.com","9001 discuss.leetcode.com","9001 com"]
解释:例子中仅包含一个网站域名:"discuss.leetcode.com"。
按照前文描述,子域名 "leetcode.com" 和 "com" 都会被访问,所以它们都被访问了 9001 次。
输入:cpdomains = ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"]
输出:["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"]
解释:按照前文描述,会访问 "google.mail.com" 900 次,"yahoo.com" 50 次,"intel.mail.com" 1 次,"wiki.org" 5 次。
而对于父域名,会访问 "mail.com" 900 + 1 = 901 次,"com" 900 + 50 + 1 = 951 次,和 "org" 5 次。
提示:
1 <=
cpdomain.length
<= 100
1 <=cpdomain[i].length
<= 100
cpdomain[i]
会遵循 "repi d1i.d2i.d3i
" 或 "repi d1i.d2i
" 格式
repi
是范围[
1, 104] 内的一个整数
d1i
、d2i
和d3i
由小写英文字母组成
思路见代码和代码注释:
class Solution:
def subdomainVisits(self, cpdomains: List[str]) -> List[str]:
# 哈希表,每次先把前面的数字取出,然后从后向前遍历,遇到'.'就将后面的字符串放进哈希表,数量加上之前的。
hashmap = {}
res = []
def deal(string):
nums, half_last = string.split(' ')
nums = int(nums) # 类型转换
# 处理half_last
str_ = ''
for i in range(len(half_last)-1, -1, -1):
if half_last[i] == '.':
if str_ in hashmap:
hashmap[str_] += nums
else:
hashmap[str_] = nums
str_ = half_last[i] + str_
# 将最长域名加入其中
if half_last in hashmap:
hashmap[half_last] += nums
else:
hashmap[half_last] = nums
for ch in cpdomains:
deal(ch)
for key, value in hashmap.items():
res.append(str(value) + ' ' + key)
return res
最长回文子序列
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例:
输入:s = "bbbab"
输出:4
解释:一个可能的最长回文子序列为 "bbbb" 。
输入:s = "cbbd"
输出:2
解释:一个可能的最长回文子序列为 "bb" 。
提示:
1 <= s.length <= 1000
s
仅由小写英文字母组成
思路:动态规划,如果一个子串是回文序列,那去掉两端的字符依然是回文序列。两种情况,两端字符相等dp[i][j] = dp[i+1][j-1] + 2
,两端字符不相同dp[i][j] = max(dp[i+1][j], dp[i][j-1])
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
dp = [[0]*len(s) for _ in range(len(s))]
for i in range(len(s)-1, -1, -1):
dp[i][i] = 1
for j in range(i + 1, len(s)):
if s[i] == s[j]:
dp[i][j] = dp[i+1][j-1] + 2
else:
dp[i][j] = max(dp[i+1][j], dp[i][j-1])
return dp[0][len(s)-1]