[leetcode]PythonおよびTrieツリーによる[14.最長共通プレフィックス]
2265 ワード
原題
文字列配列の最長の共通接頭辞を検索する関数を作成します.
共通の接頭辞が存在しない場合は、空の文字列「」を返します.
例1:入力:[[flower]、[flow]、[flight]]出力:[fl]
例2:入力:["dog","racecar","car"]出力:""
説明:入力に共通接頭辞は存在しません.
Trieツリーによる実装
Trieツリーの簡略化はTrie数の簡略化版に相当し、ツリーを構築する操作 を省いただけだ. zipを利用してstrsのすべての要素対応ビットを1つのlistにパッケージ化し、set()を利用してこのlistを再削除すると、残りの数は重複しない文字の個数であり、1であれば共通接頭辞の1つを表し、 を下に遍歴し続ける.例えば、「flower」、「flow」、「flight」、zip(*strs)と入力した結果、[‘f’,‘f’,‘f’,[‘l’,‘l’,‘l’],[‘o’,‘o’,‘i’],[‘w’,‘w’,‘g’],set()後の結果は、それぞれ[‘f’,[‘l’],[‘l’,[‘o’,‘i’,[‘w’,‘g’]] である
文字列配列の最長の共通接頭辞を検索する関数を作成します.
共通の接頭辞が存在しない場合は、空の文字列「」を返します.
例1:入力:[[flower]、[flow]、[flight]]出力:[fl]
例2:入力:["dog","racecar","car"]出力:""
説明:入力に共通接頭辞は存在しません.
Trieツリーによる実装
class TrieNode(object):
# Python Trie
def __init__(self):
self.child = {}
self.flag = None
class Solution(object):
def __init__(self):
self.root = TrieNode()
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []:
return ''
elif len(strs) == 1:
return strs[0]
for words in strs: # strs Trie
curNode = self.root
for word in words:
if curNode.child.get(word) is None:
nextNode = TrieNode()
curNode.child[word] = nextNode
curNode = curNode.child[word]
curNode.flag = 1
curNode = self.root
lcp = []
while curNode.flag != 1: # Trie , 1
if len(curNode.child) == 1:
lcp.append(list(curNode.child.keys())[0])
curNode = curNode.child[list(curNode.child.keys())[0]]
else:
break
return ''.join(lcp)
Trieツリーの簡略化
class Solution(object):
def longestCommonPrefix(self, strs):
"""
:type strs: List[str]
:rtype: str
"""
if strs == []:
return ''
elif len(strs) == 1:
return strs[0]
lcp= ""
for each in zip(*strs):
if len(set(each)) == 1:
lcp += each[0]
else:
return lcp
return lcp