题目链接
二分查找、
不会呀,还是看题解稍稍理解一点.
首先建立一个字符对应出现位置的二维表结构。
还是举例说明吧
例如 s = "abcddf"
word = "abdf"
假如第一次找到字符a在s中出现的位置是0,则下一个字符也就是b字符只能出现在1~5,(因为word是s的子串要保持先后顺序不变。)因此记录下这个下标也就是0,然后再在b字符对应的下标数组中寻找大于0的下标,也就是出现在a之后的字符。如果有则继续执行,如果没有(it==end())就说明此单词不是s的子串。
class Solution {
public:
int numMatchingSubseq(string s, vector<string>& words) {
vector<vector<int>> ps(26);
for(int i=0;i<s.size();i++)
{
ps[s[i]-'a'].push_back(i);
}//存储每一个字符在s中的位置
int res = words.size();
for (int i = 0; i < words.size(); i++)
{
auto tmp = words[i];
if(tmp.size()>s.size())
{
res--;
continue;
}
int cur= -1;
for(char c : tmp)
{
auto it=upper_bound(ps[c-'a'].begin(),ps[c-'a'].end(),cur);
if(it==ps[c-'a'].end())//如果没找到
{
res--;
break;
}
cur=*it;
}
}
return res;
}
};
这里有一个内置二分查找函数upper_bound()
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
更多c++二分查找函数
C++——关于lower_bound( )和upper_bound( )的常见用法_xiaonuolen的博客-CSDN博客