27、字符流

题目描述:
按下述要求实现 StreamChecker 类:

StreamChecker(words):构造函数,用给定的字词初始化数据结构。
query(letter):如果存在某些 k >= 1,可以用查询的最后 k个字符(按从旧到新顺序,包括刚刚查询的字母)拼写出给定字词表中的某一字词时,返回 true。否则,返回 false。

示例:

StreamChecker streamChecker = new StreamChecker([“cd”,“f”,“kl”]); // 初始化字典
streamChecker.query(‘a’); // 返回 false
streamChecker.query(‘b’); // 返回 false
streamChecker.query(‘c’); // 返回 false
streamChecker.query(‘d’); // 返回 true,因为 ‘cd’ 在字词表中
streamChecker.query(‘e’); // 返回 false
streamChecker.query(‘f’); // 返回 true,因为 ‘f’ 在字词表中
streamChecker.query(‘g’); // 返回 false
streamChecker.query(‘h’); // 返回 false
streamChecker.query(‘i’); // 返回 false
streamChecker.query(‘j’); // 返回 false
streamChecker.query(‘k’); // 返回 false
streamChecker.query(‘l’); // 返回 true,因为 ‘kl’ 在字词表中。

提示:

1 <= words.length <= 2000
1 <= words[i].length <= 2000
字词只包含小写英文字母。
待查项只包含小写英文字母。
待查项最多 40000 个。

使用字典树

class Mytree{
	boolean isend;
	Mytree child[] = new Mytree[26];
}
class StreamChecker {
	Mytree tree;
	List<Character> list;
    public StreamChecker(String[] words) {
    	list = new ArrayList<>();
    	tree = new Mytree();
        for (String string : words) {
        	Mytree temroot = tree;
        	char tem[] = string.toCharArray();
        	for (int i = tem.length - 1; i >= 0; i--) {
				char c = tem[i];
				if(temroot.child[c - 'a'] == null){
					temroot.child[c - 'a'] = new Mytree();
				}
				temroot = temroot.child[c - 'a'];
			}
        	temroot.isend = true;
		}
    }
    public boolean query(char letter) {
    	list.add(letter);
    	Mytree tem = tree;
    	int size = list.size();
    	for (int i = size - 1; i >= 0 ; i--) {
    		if(tem.child[list.get(i) - 'a'] == null){
    			return false;
    		}else {
				tem = tem.child[list.get(i) - 'a'];
				if(tem.isend){
					return true;
				}
			}
		}
    	return false;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值