[LeetCode] 0139. ワードブレイク問題

Python、C++、JavaScript、SQL、TypeScript の多様な LeetCode ソリューションを探索してください。面接の準備、学習、複数のプログラミング言語でのコードの練習に最適です。 Github リポジトリ リンク

中くらい

 


文字列を与える s そして文字列の辞書 単語辞書、 戻る 真実 もし s スペースで区切られた 1 つ以上の辞書単語のシーケンスに分割できます。

注記 辞書内の同じ単語がセグメンテーションで複数回再利用される可能性があること。

例 1:

入力: s = "リートコード", wordDict = ["リート","コード"]
出力: 真実
説明: 「leetcode」は「leet code」としてセグメント化できるため、true を返します。

例 2:

入力: s = "アップルペンアップル", wordDict = ["アップル","ペン"]
出力: 真実
説明: 「applepenapple」は「applepenapple」として分割できるため、true を返します。辞書の単語を再利用できることに注意してください。

例 3:

入力: s = "catsandog", wordDict = ["cats","dog","sand","and","cat"]
出力: 間違い

制約:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s そして wordDict[i] 小文字の英字のみで構成されています。
  • のすべての文字列 単語辞書 は 個性的.

パイソン

				
					# 試行 # 時間計算量: O(n^2 + m*k) # 空間計算量: 入力による O(n + m*k) import リスト クラス TrieNode: def __init__(self): self.isWord = False self.children = {} クラスの解決策: def wordBreak(self, s: str, wordDict: List[str]) -> bool: root = TrieNode() for wordDict: wordDict の word の curr = root: c が curr.children にない場合: curr.children[c] = TrieNode() curr = curr.children[c] curr.isWord = True dp = [False] * len(s) for i in range(len(s)): if i == 0または dp[i-1]: curr = range(i, len(s)) の j のルート: c が curr.children にない場合は c = s[j]: curr の場合はbreak curr = curr.children[c]。 isWord: dp[j] = True return dp[-1] # DP 2 # 時間計算量: O(n^3 +m*k) # 空間計算量: O(n+m*k) インポート リスト # クラスからの #解決策: # def wordBreak(self, s: str, wordDict: List[str]) -> bool: # sLen = len(s) # Words = set(wordDict) # dp = [False] * (sLen + 1) # dp[0] = True range(1, sLen + 1) の i に対して #: range(i) 内の j に対して #: dp[j] と s[j:i] がワードの場合 #: # dp[i] = True # Break # return True # DP 1 # 時間計算量: O(n*m*k) # 空間計算量: O(n) # # 入力インポート リストからの # クラス 解決策: # def wordBreak(self, s: str, wordDict : List[str]) -> bool: # sLen = len(s) # dp = [False] * sLen # for i in range(sLen): # for word in wordDict: # wordLen = len(word) # if i < wordLen - 1: # 継続 # if i == wordLen - 1 または dp[i-wordLen]: # if s[i-wordLen+1:i + 1] == word: # dp[i] = True # ブレーク# print(dp) # return dp[sLen-1] # BFS # 時間計算量: O(n^3 + m*k) # 空間計算量: O(n+m*k) # コレクションからの # import deque 入力からの # import List # クラス 解決策: # def wordBreak(self, s: str, wordDict: List[str]) -> bool: # Words = set(wordDict) # queue = deque([0]) # seen = set() # while queue: # start = queue.popleft() # if start == len(s): # return True # for end in range(start + 1, len(s) + 1): # if end in seen: # continue # if s[start:end] in word: # queue.append(end) # seen.add(end) # return False S = "applepenapple" WordDict = ["apple", "pen"] print(Solution(). wordBreak(S, WordDict))
				
			
ja日本語