题目描述:
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.root={
}
self.end_of_word='#'
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
node=self.root
for char in word:
node=node.setdefault(char,{
}) #字典的内置函数setdefault()
node[self.end_of_word]=self.end_of_word
def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
node=self.root
for char in word:
if char in node:
node=node[char]
else:
return False
if self.end_of_word in node:
return True
else:
return False
def startsWith(self, prefix: str) -> bool:
"""
Returns if there is any word in the trie that starts with the given prefix.
"""
node=self.root
for char in prefix:
if char in node:
node=node[char]
else:
return False
return True
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)
题目描述;
将非负整数 num 转换为其对应的英文表示。
class Solution:
def numberToWords(self, num: int) -> str:
d1=['','One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen','Seventeen','Eighteen','Nineteen','Twenty']
d2=['','Ten','Twenty','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety']
if num==0:return 'Zero'
if num<=20:return d1[num]
if num<100:
t,d=num//10,num%10
return d2[t]+' '+d1[d] if d>0 else d2[t]
if num<1000:
h=num//100
if num%100==0:return d1[h]+' Hundred'
return d1[h]+' Hundred '+self.numberToWords(num%100)
if num<10**6:
th=num//10**3
if num%10**3==0:
return self.numberToWords(th)+' Thousand'
return self.numberToWords(th)+' Thousand '+self.numberToWords(num%10**3)
if num<10**9:
mi=num//10**6
if num%10**6==0:
return self.numberToWords(mi)+' Million'
return self.numberToWords(mi)+' Million '+self.numberToWords(num%10**6)
if num<10**12:
bi=num//10**9
if num%10**9==0:
return d1[num//10**9]+' Billion'
return self.numberToWords(bi)+' Billion '+self.numberToWords(num%10**9)
题目描述:
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
'''
假设母串S是由子串s重复N次而成, 则 S+S则有子串s重复2N次,
那么现在有:S=Ns, S+S=2Ns, 其中N>=2。
如果条件成立, S+S=2Ns, 掐头去尾破坏2个s,S+S中还包含2*(N-1)s,
又因为N>=2, 因此s在(S+S)[1:-1]中必出现一次以上
假设母串S由子串a+b组成,则(S+S)=a+b+a+b,
掐头去尾,则开头的a和最后的b无法匹配,相当于(S+S)[1:-1] = c+b+a+d ,
其中c!=a, d!=b,如果a+b在其中出现,则必然有a=b
'''
return s in (s+s)[1:-1]
题目描述:
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。
注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”
class Solution:
def repeatedStringMatch(self, a: str, b: str) -> int:
#关键在于终止长度,2*a+b
n=(len(b)*2)//(len(a))+1
for i in range(1,n+2):
if b in a*i:
return i
return -1
题目描述:
给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。
我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
S=sum(nums)
left=0
for i in range(len(nums)):
right=S-nums[i]-left
if right==left:
return i
left+=nums[i]
return -1