211
タイトルの説明:
新しい単語の追加と、その文字列が以前に追加された文字列と一致するかどうかの検索をサポートするデータ構造を設計してください。
辞書クラスを実装するWordDictionary:
WordDictionary()は辞書オブジェクトを初期化します
void addWord(word)はデータ構造に単語を追加し、それと一致させることができます
bool search(word)データ構造に単語と一致する文字列がある場合、 trueを返します。それ以外の場合はfalseを返します。単語には「。」を含めることができ、各。は任意の文字を表すことができます。
例:
回答:
class WordDictionary:
def __init__(self):
"""
Initialize your data structure here.
"""
from collections import defaultdict
self.lookup={
}
def addWord(self, word: str) -> None:
tree=self.lookup
for a in word:
tree=tree.setdefault(a,{
})
tree["#"]={
}
def search(self, word: str) -> bool:
def helper(word,tree):
if not word:
if "#" in tree:
return True
return False
if word[0]==".":
for t in tree:
if helper(word[1:],tree[t]):
return True
elif word[0] in tree:
if helper(word[1:],tree[word[0]]):
return True
return False
return helper(word,self.lookup)
# Your WordDictionary object will be instantiated and called as such:
# obj = WordDictionary()
# obj.addWord(word)
# param_2 = obj.search(word)
648
タイトルの説明:
英語では、rootと呼ばれる概念があり、その後に他の単語を続けて別の長い単語を形成できます。これを後継単語と呼びます。たとえば、ルートanの後に単語otherが続くと、新しい単語anotherを形成できます。
さて、多くのルーツと文で構成される辞書が与えられました。文中の継承されたすべての単語をルートに置き換える必要があります。継承された単語にそれを形成できる多くのルートがある場合は、最短のルートに置き換えます。
置換後に文を出力する必要があります。
例:
回答:
class Solution:
def replaceWords(self, dictionary: List[str], sentence: str) -> str:
rootset=set(dictionary) #将所有单词存入集合,去重,方便存取
def replace(word):
for i in range(1,len(word)):
if word[:i] in rootset:
return word[:i]
return word
return " ".join(map(replace,sentence.split()))
778
タイトルの説明:
N x N座標グリッドでは、各グリッドグリッド[i] [j]の値は、位置(i、j)でのプラットフォームの高さを表します。
今、雨が降っています。時刻がtの場合、この時点での雨によるプール内の任意の位置の水位はtです。1つのプラットフォームから隣接するプラットフォームまで泳ぐことができますが、水位が両方のプラットフォームに同時に浸水する必要があることが前提です。瞬時に無限の距離を移動できると仮定すると、デフォルトで正方形内を泳ぐのに時間はかかりません。もちろん、泳ぐときはグリッドに留まらなければなりません。
座標グリッドの左上のプラットフォーム(0、0)から開始します。少なくとも座標グリッドの右下のプラットフォーム(N-1、N-1)に到達するのにどのくらい時間がかかりますか?
例:
回答:
class Solution:
def swimInWater(self, grid: List[List[int]]) -> int:
f={
}
def find(x):
f.setdefault(x,x)
while x!=f[x]:
f[x]=f[f[x]]
x=f[x]
return x
def union(x,y):
f[find(x)]=find(y)
rows,cols=len(grid),len(grid[0])
edges=[]
for i in range(rows):
for j in range(cols):
idx=i*cols+j
if i: edges.append([idx,idx-cols,max(grid[i][j],grid[i-1][j])])
if j: edges.append([idx,idx-1,max(grid[i][j],grid[i][j-1])])
edges.sort(key=lambda x:x[2])
ans=0
for x,y,w in edges:
if find(x)==find(y): continue
union(x,y)
ans=max(ans,w)
if find(0)==find(rows*cols-1):break
return ans
1631年
トピックの説明:
あなたはハイキング活動に参加しようとしています。2次元の行x列のマップの高さを指定します。ここで、heights [row] [col]はグリッドの高さ(row、col)を表します。最初は左上隅(0、0)にいて、右下隅(行-1、列-1)に移動します(下付き文字は0から番号が付けられていることに注意してください)。毎回4つの方向のいずれかで上下左右に移動でき、エネルギー消費量が最も少ないパスを見つけたいと考えています。
パスによって消費される物理エネルギーは、パス上の隣接するグリッド間の高さの差の最大絶対値によって決定されます。
左上隅から右下隅まで歩くための最小運動値を返してください。
例:
回答:
class Solution:
def minimumEffortPath(self, heights: List[List[int]]) -> int:
#暴力破解
que=deque([[0,0,0]])
t=[[float('inf')]*len(i) for i in heights]
t[0][0]=0
while que:
i,j,k=que.popleft()
if k<=t[i][j]:
for x,y in (i+1,j),(i-1,j),(i,j-1),(i,j+1):
if 0<=x<len(heights) and 0<=y<len(heights[0]):
z=max(k,abs(heights[x][y]-heights[i][j]))
if z<t[x][y]:
t[x][y]=z
que.append((x,y,z))
return t[-1][-1]
面接の質問08.07
タイトルの説明:
文字列を繰り返さない順列と組み合わせ。文字列のすべての順列と組み合わせを計算するメソッドを記述します。文字列の各文字は異なります。
例:
回答:
class Solution:
def permutation(self, S: str) -> List[str]:
#python自带排列组合方法
from itertools import permutations
result=[]
for i in permutations(S,len(S)):
result.append("".join(i))
return result