0130leetcode刷题5道python

208

题目描述:
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

示例:
0130leetcode刷题5道python_第1张图片
解答:

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)

273

题目描述;
将非负整数 num 转换为其对应的英文表示。

示例:
0130leetcode刷题5道python_第2张图片
解答:

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)

459

题目描述:
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例:
0130leetcode刷题5道python_第3张图片
解答:

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]

686

题目描述:
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。
注意:字符串 “abc” 重复叠加 0 次是 “”,重复叠加 1 次是 “abc”,重复叠加 2 次是 “abcabc”

示例:
0130leetcode刷题5道python_第4张图片
解答:

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

724

题目描述:
给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。
我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。
如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。

示例:
0130leetcode刷题5道python_第5张图片
解答:

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

你可能感兴趣的:(leetcode,python)