带大写小写的auto complete
给IDE设计一个autocomplete功能。给出一个如下的String[]。要求输入大写字母和几个小写字母后,实现autocomplete。大写字母必须全部match。感觉是用Trie,但怎么存怎么查没想明白。欢迎大家讨论。
String[] className {
"GraphView",
"DataGraphView",
"DataController",
"GraphViewController",
"DataScienceView"
}
autocomplete(String[] className, "Data"); --> {"DataGraphView", "DataController", "DataScienceView"};
autocomplete(String[] className, "GVi"); --> {"GraphView", "GraphViewController"};
autocomplete(String[] className, "GraphController"); --> {""};
分析:
每个大写之间加上*,这样小写可以任意匹配
search函数递归
1 树完了 返回
2 词完了 继续把树遍历完
3 树到hasword节点,该单词塞入
搜索词的时候,遇到*,树动单词*不动,直到遇到大写为止
class TriNode:
def __init__(self,c):
self.c = c
self.children = {}
self.hasWord = False
class AutoComplete:
root = TriNode(0)
def __init__(self, strs):
for i in strs:
self.insert(i)
def insert(self,s):
cur = self.root
for i in s:
if i not in cur.children:
cur.children[i] = TriNode(i)
cur = cur.children[i]
cur.hasWord = True
def search(self,s,root,pos,path,ret):
if root.hasWord: #一个单词可加入
ret.append(path)
if not len(root.children):#树到尽头要返回
return
if pos+1>=len(s):#词到尽头 抛弃词只搜索树
for child in root.children:
self.search(s, root.children[child], pos + 1, path + root.children[child].c, ret)
else: #搜索词
if s[pos] != '*':
for child in root.children:
if s[pos] == root.children[child].c:
self.search(s, root.children[child], pos + 1, path + s[pos], ret)
else:
for child in root.children:
if root.children[child].c.islower():
self.search(s,root.children[child],pos,path+root.children[child].c,ret) #匹配*, s不动,trie一直往下走
else:
if s[pos + 1] == root.children[child].c:
self.search(s,root.children[child], pos + 2, path + root.children[child].c, ret) #遇到大写,可以匹配s了
def autoComplete(self,s):
ns =[]
for i in range(len(s)):
if i!=0 and s[i].isupper():
ns.append('*')
ns.append(s[i])
else:
ns.append(s[i])
ns.append('*')
s = ''.join(ns)
ret = []
self.search(s,self.root,0,"",ret)
return ret
Last updated