1032. 字符流
按下述要求实现 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 个。
解题思路
1)首先是将words里面的词按照词的长度存储在 map<int , vector> tmpmap;
2)然后按照长度截取strtmp = str.substr(len - comLen) ;
3)比较strtmp 和 vector data数据比较;if “==” , return true ;else return fasle ;
注意:不能通过全部的测试用例;
class StreamChecker {
private:
vector<string> data ;
string str = "" ;
int len ;
//map<int , int> datamap ;
map<int , vector<string>> tmpmap ;
public:
StreamChecker(vector<string>& words) {
int tmplen ;
//map<int , vector<string>> tmpmap ;
vector<string> strV ;
for (auto tmp : words)
{
tmplen = tmp.length() ;
if (tmpmap.count(tmplen) <= 0)
tmpmap[tmplen] = strV ;
tmpmap[tmplen].push_back(tmp) ;
}
for (auto tmpv : tmpmap)
{
for (auto tmpE : tmpv.second)
data.push_back(tmpE) ;
//datamap[tmpv.first] = data.size() ;
}
len = 0 ;
}
bool query(char letter) {
str += letter ;
len ++ ;
int comLen ;
string strtmp ;
/*for(auto tpair : datamap)
{
if (len >= tpair.first)
comlen = tpair.second ;
else
break ;
}*/
for (auto tpair : tmpmap)
{
comLen = tpair.first ;
if (comLen > len) break ;
strtmp = str.substr(len - comLen) ;
for (auto comD : tpair.second)
if (strtmp == comD)
return true ;
}
return false ;
}
};