99.77% Python Solution with Precheck
class Solution(object):\n    def exist(self, board, word):\n        """\n        :type board: List[List[str]]\n        :type word: str\n        :rtype: bool\n  
    class Solution(object):\n    def exist(self, board, word):\n        """\n        :type board: List[List[str]]\n        :type word: str\n        :rtype: bool\n        """\n        def preCheck():\n            preDict = {}\n\n            for i in word:\n                if i in preDict: preDict[i]+=1\n                else: preDict[i] = 1\n            \n            for i in board:\n                for j in i:\n                    if j in preDict and preDict[j]>0: preDict[j]-=1\n            for i in preDict.values():\n                if i>0: return False\n            return True\n                    \n        def helper(wordIdx, x, y):\n            if board[x][y] != word[wordIdx]: return False\n            elif wordIdx == l-1: return True\n            else:\n                wordIdx += 1\n                tempChar = board[x][y]\n                board[x][y] = None\n                for d in [(0,1),(0,-1),(1,0),(-1,0)]:\n                    xNext = x+d[0]\n                    yNext = y+d[1]\n                    if -1<xNext<m and -1<yNext<n and board[xNext][yNext]: \n                        if helper(wordIdx, xNext, yNext): return True\n                board[x][y] = tempChar\n                return False\n        \n        if not board: return False\n        if not word: return True\n\n        if not preCheck(): return False\n        \n        m = len(board)\n        n = len(board[0])\n        l = len(word)\n        for i in xrange(m):\n            for j in xrange(n):\n                if helper(0,i,j): return True\n\n        return False
['Python']