2015-10-25 9 views
17

मैंने कुछ समान समाधानों को डिबग किया है, लेकिन सोच रहा है कि क्या हम आंशिक मिलान उपसर्ग (ट्री ट्री की खोज विधि में) ट्री ट्री को बेहतर बना सकते हैं, वर्तमान खोज विधि केवल जांचें कि एक पूर्ण शब्द मेल खाता है या नहीं नहीं) प्रदर्शन में सुधार करने के लिए, जो पहले गलत रास्ते से वापस आ सकता है? मुझे इस विचार के लिए बहुत आश्वस्त नहीं है, इसलिए पहले सलाह की तलाश करें।शब्द खोज में ट्री ट्री मैच प्रदर्शन

मैं इसी तरह के समाधानों में से एक पोस्ट करता हूं। धन्यवाद।


2 डी बोर्ड और शब्दकोश से शब्दों की एक सूची को देखते हुए, बोर्ड में सभी शब्द खोजें।

प्रत्येक शब्द अनुक्रमिक रूप से आसन्न सेल के अक्षरों से बनाया जाना चाहिए, जहां "आसन्न" कोशिकाएं क्षैतिज या लंबवत पड़ोसी हैं। एक ही अक्षर कक्ष का प्रयोग किसी शब्द में एक से अधिक बार नहीं किया जा सकता है।

उदाहरण के लिए, को देखते हुए शब्द = ["oath","pea","eat","rain"] और बोर्ड =

[ 
    ['o','a','a','n'], 
    ['e','t','a','e'], 
    ['i','h','k','r'], 
    ['i','f','l','v'] 
] 

वापसी [ "खाने", "शपथ"]

class TrieNode(): 
    def __init__(self): 
     self.children = collections.defaultdict(TrieNode) 
     self.isWord = False 

class Trie(): 
    def __init__(self): 
     self.root = TrieNode() 

    def insert(self, word): 
     node = self.root 
     for w in word: 
      node = node.children[w] 
     node.isWord = True 

    def search(self, word): 
     node = self.root 
     for w in word: 
      node = node.children.get(w) 
      if not node: 
       return False 
     return node.isWord 

class Solution(object): 
    def findWords(self, board, words): 
     res = [] 
     trie = Trie() 
     node = trie.root 
     for w in words: 
      trie.insert(w) 
     for i in xrange(len(board)): 
      for j in xrange(len(board[0])): 
       self.dfs(board, node, i, j, "", res) 
     return res 

    def dfs(self, board, node, i, j, path, res): 
     if node.isWord: 
      res.append(path) 
      node.isWord = False 
     if i < 0 or i >= len(board) or j < 0 or j >= len(board[0]): 
      return 
     tmp = board[i][j] 
     node = node.children.get(tmp) 
     if not node: 
      return 
     board[i][j] = "#" 
     self.dfs(board, node, i+1, j, path+tmp, res) 
     self.dfs(board, node, i-1, j, path+tmp, res) 
     self.dfs(board, node, i, j-1, path+tmp, res) 
     self.dfs(board, node, i, j+1, path+tmp, res) 
     board[i][j] = tmp 
+0

यदि किसी के पास मेरे प्रश्न पर प्रदर्शन और टिप्पणी में सुधार करने के लिए कोई अच्छा विचार है, तो यह बहुत अच्छा होगा। धन्यवाद। :) –

+2

लीटकोड से ऐसे परिचित प्रश्न :) – stanleyli

उत्तर

8

मैं कुछ भी Trie भाग में से गलत नहीं दिख रहा है तुम्हारा कोड।

लेकिन मुझे लगता है कि त्रिभुज के मूल डिजाइन में पहले से ही किसी भी मेल नहीं खाते का पता लगाना शुरू हो गया है।

दरअसल, मैं आमतौर पर समस्या को जटिल बनाने से बचने के लिए defaultDict + TrieNode के बजाय नियमित रूप से dict का उपयोग करता हूं। यदि कोई निश्चित नोड मान्य शब्द है तो आपको केवल "#" कुंजी सेट करने की आवश्यकता है। और, सम्मिलन के दौरान, बस node[w] = {} करें।

यदि आप ऐसा करते हैं, तो आपका कोड काफी सरल हो सकता है और प्रारंभिक वापसी सरल होगी, क्योंकि आपके पास नोड में "गलत" कुंजी नहीं होगी!

उदाहरण के लिए, केवल 'ab' युक्त एक साधारण त्रिज्या इस तरह दिखेगा: {'a': {'b': {'#': {}}}। तो जब आप 'cd' खोजते हैं, जैसे ही आपको एहसास हुआ कि बाहरीतम निर्देश में 'c' कोई कुंजी नहीं है, तो आप झूठी वापसी कर सकते हैं। यह कार्यान्वयन आपके जैसा ही है, लेकिन मेरा मानना ​​है कि इसे समझना आसान है।

+0

धन्यवाद स्टैनलेली, शब्दकोश आधारित समाधान से सहमत हैं, आइए यहां ट्री पेड़ से बात करें। आपकी टिप्पणियों के लिए, "इसलिए मुझे नहीं लगता कि यह गलत रास्ते से लौटने से" अनुकूलन "है", आपको लगता है कि जल्दी वापसी के लिए कोई समाधान क्यों नहीं है? यदि कोई उपसर्ग मैच नहीं है, तो शब्दकोश मिलान में निर्णय लेने के लिए कोई वापसी नहीं होनी चाहिए? :) –

+0

धन्यवाद स्टैनलेली, मेरा प्रश्न पारंपरिक ट्री पेड़ के लिए है, यह सच है (एक शब्द के लिए पूर्ण मिलान, जो है IWord == मेरे नमूने में सच है), या झूठी वापसी जो मेल नहीं खाता है। आंशिक मिलान के लिए, आपको लगता है कि हमें रिटर्न प्रकार और तर्क व्यवस्थित करना चाहिए - मुझे लगता है कि हमें 3 प्रकार, पूर्ण मिलान, आंशिक मिलान या कोई मैच वापस करने की आवश्यकता नहीं है? धन्यवाद। –

+1

क्षमा करें मैं आपकी टिप्पणी में "आंशिक मिलान" से आपका क्या मतलब है उससे उलझन में हूं। मैंने सोचा कि तुम्हारा क्या मतलब है मेरे जवाब में उदाहरण है। शायद आप बेहतर व्याख्या करने के लिए एक उदाहरण दे सकते हैं? – stanleyli

संबंधित मुद्दे