C ++中的匹配子序列数
假设我们有一个字符串S和一个单词word的字典,请找到单词S的子序列[i]的数量。因此,如果输入为S=“abcde”,而字典为[“a”,“bb”,“acd”,“ace”],则输出为3。因为字典中存在三个单词序列,它们是S的子序列:“a”,“acd”和“ace”
为了解决这个问题,我们将遵循以下步骤-
n:=单词数组的大小
创建一张映射
对于我来说,范围是0至字数
在映射的m[words[i,0]]位置插入words[i]
回答:=0
对于范围从0到S的i
temp:=m[x],然后删除m[x]
对于范围在0到临时大小之间的j
如果temp[j]的大小=1,则将ans加1,否则将temp[j]的子字符串从索引1插入m[temp[j,1]]
字符x:=S[i]
如果在映射m中存在x,则
返回ans
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numMatchingSubseq(string S, vector<string>& words) {
int n = words.size();
map <char, vector <string> > m;
for(int i = 0; i < words.size(); i++){
m[words[i][0]].push_back(words[i]);
}
int ans = 0;
for(int i = 0; i < S.size(); i++){
char x = S[i];
if(m.find(x) != m.end()){
vector <string> temp = m[x];
m.erase(x);
for(int j = 0; j < temp.size(); j++){
if(temp[j].size() == 1){
ans++;
} else {
m[temp[j][1]].push_back(temp[j].substr(1));
}
}
}
}
return ans;
}
};
int main() {
Solution ob1;
string s = "abcde";
vector<string> v{"a","bb","acd","ace"};
cout << ob1.numMatchingSubseq(s, v) << endl;
return 0;
}输入值
"abcde"
["a","bb","acd","ace"]
string s = "abcde";
vector<string> v{"a","bb","acd","ace"};输出结果
3