131、分割されたパリンドローム配列
文字列sは、sはサブストリングの数に分割されて与えられた、各サブストリングは、ストリングパリンドロームです。
Sは、すべての可能なパーティションスキームを返します。
例:
入力: "AAB"
出力:
[
[ "AA"、 "B"]、
[ "A"、 "A"、 "B"]
]
方法1:バックトラック
class Solution:
def partition(self, s: str) -> List[List[str]]:
if not s:
return [[]]
res = []
for i in range(len(s)):
tmp = s[:i+1]
if tmp == tmp[::-1]:
for j in self.partition(s[i+1 :]):
res.append([tmp]+ j)
return res
125パリンドローム配列検証
文字列を考えると、大文字小文字を無視することができる、唯一のアルファベットと数字を検討し、それが回文文字列であることを確認してください。
説明:この問題では、我々は有効な回文配列として空の文字列を定義します。
例1:
入力:「男、計画、運河:パナマ」
出力:真
例2:
入力:「カーレース」
出力:偽
注意:自分の部門は単純なアプローチを書き込むための回文文字列を見ないとき
策1:
class Solution:
def isPalindrome(self, s: str) -> bool:
if not s:
return True
s1 = s.lower()
res = []
for i in s1:
if i.isalpha() or i.isdigit():
res.append(i)
if res == res[::-1]:
return True
else:
return False
解決策2:
class Solution:
def isPalindrome(self, s: str) -> bool:
if not s:
return True
s1 = s.lower()
res = []
for i in s1:
if i.isalpha() or i.isdigit():
res.append(i)
if len(res)%2 == 0:
i,j = 0,len(res)-1
while i <= (len(res)/2 - 1) and j >= len(res)/2:
if res[i] != res[j]:
return False
i += 1
j -= 1
return True
else:
i,j = 0,len(res)-1
while i <= (len(res)//2 -1) and j > len(res)//2 :
if res[i] != res[j]:
return False
i += 1
j -= 1
return True
139、単語分割
適度
単語リストを備える文字列s非空と非空の辞書のwordDictを考えると、空間Sが辞書に表示される1つまたは複数の単語に分割することができるかどうかが決定されます。
説明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
例1:
入力:S = "leetcode"、wordDict = [ "すご腕"、 "コード"]
出力:真
の解釈: "leetcodeは" "すご腕コード"に分割することができますので、trueを返します。
例2:
入力:S = "applepenapple"、wordDictは = [ "りんご"、 "ペン"]
出力:真
の解釈: "applepenapple"は"リンゴのペンりんご"に分割することができますので、trueを返します。
あなたは辞書で単語を再利用できることに注意してください。
例3:
入力:S = "catsandog"、wordDict = [ "猫"、 "犬"、 "砂"、 "および"、 "猫"]
出力:偽
注意:動的プログラミングの使用を
class Solution:
def wordBreak(self, s: str, wordDict: List[str]) -> bool:
if not s:
return True
dp = [0]
for i in range(len(s)+1):
for j in dp:
if s[j:i] in wordDict:
dp.append(i)
break
return dp[-1] == len(s)
140、単語分割II
難しさ
リターンセクションの
単語分割II
与えられた文字列s非空と非空の辞書のwordDictは文、すべての単語が辞書にあるような文を構築するために、文字列内のスペースを増やすために、単語のリストを含みます。これらすべての可能な文を返します。
説明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
例1:
输入:
S =「catsanddog」
wordDict = [「猫」、「猫」、「および」、「砂」、「犬」]
输出:
[
「猫と犬」、
「猫砂犬」
]
例2:
入力:
S = "pineapplepenapple"
wordDict = [ "アップル"、 "PEN"、 "applepen"、 "パイン"、 "パイナップル"]
出力:
[
"パインアップルPENアップル"、
"パイナップルPENアップル"、
アップルapplepen「パイン"
]
説明:あなたは辞書に単語を再利用できることに注意してください。
例3:
入力:
S = "catsandog"
wordDict = [ "CATS"、 "犬"、 "砂"、 "および"、 "CAT"]
出力:
[]
注:問題解決のアイデア:かどうかを判断するために、そして、我々はDFSを考慮しなければならない部門のすべての方法を見つけるために、この質問は、単語の区切りを分割することができますされていないだけのよう。しかし、直接使用することは、問題解決が機能しない、DFS、なぜ?すべての時間の複雑さがないOJにより、高すぎる場合、ツリーは再びそれを横断する大きすぎるので。だから我々は、剪定する必要があり、どのようにそれを剪定しますか?動的なプログラミングの問題では単語の区切りを使用した結果は、DFSの前に、まずそれを分割することができない場合は、この1をスキップし、文字列を分割することができるかどうかを判断します。この質問は、実際にDP + DFSです。
class Solution:
def check(self,s,wordDict):
dp = [False for i in range(len(s)+1)]
dp[0] = 1
for i in range(1,len(s)+1):
for k in range(i):
if dp[k] and s[k:i] in wordDict :
dp[i] = True
return dp[len(s)]
def dfs(self,s,wordDict,stringlist):
if self.check(s,wordDict):
if len(s) == 0:
return Solution.res.append(stringlist[1:])
for i in range(1,len(s)+1):
if s[:i] in wordDict:
self.dfs(s[i:],wordDict,stringlist + ' ' + s[:i])
def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
Solution.res= []
self.dfs(s,wordDict,'')
return Solution.res