C ++中的驼峰匹配
假设我们有一个查询列表和一个模式,我们必须返回一个将是布尔值列表的答案,其中且仅当query[i]与该模式匹配时,答案[i]为真。当我们可以在模式词中插入小写字母以使其等于查询时,查询词会匹配给定的模式。
因此,如果输入类似于[“FooBar”,“FooBarTest”,“FootBall”,“FrameBuffer”,“ForceFeedBack”]和pattern=“FB”,则结果将为[true,false,true,false,false]。
为了解决这个问题,我们将遵循以下步骤-
定义一个名为的方法insertNode(),该方法需要head和string
curr:=头
当我的范围是0到s的大小–1
x:=s[i]
如果curr的child[x]不为null,则curr的child[x]:=新节点
curr:=curr的子级[x]
设置isEndofcurr:=true
从主要方法中,执行以下操作-
head:=新节点,将模式插入head,n:=查询数组的大小,m:=临时大小,确定:=true
对于j,范围从0到m–1
x:=温度[j]
如果curr的child[x],则curr:=curr的child[x]
否则,当temp[j]在A到Z的范围内时,则ok:=false并从循环中断
ans[i]:=isEndcurr和OK
返回ans
例子(C++)
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
struct Node{
bool isEnd;
map <char, Node*> child;
Node(){
isEnd = false;
}
};
class Solution {
public:
void insertNode(Node* head, string s){
Node* curr = head;
for(int i = 0; i < s.size(); i++){
char x = s[i];
if(!curr->child[x]){
curr->child[x] = new Node();
}
curr = curr->child[x];
}
curr->isEnd = true;
}
vector<bool> camelMatch(vector<string>& queries, string pattern){
Node* head = new Node();
insertNode(head, pattern);
int n = queries.size();
vector <bool> ans(n);
Node* curr;
bool ok;
for(int i = 0; i < n; i++){
string temp = queries[i];
curr = head;
int m = temp.size();
ok = true;
for(int j = 0; j < m; j++){
char x = temp[j];
if(curr->child[x]){
curr = curr->child[x];
}
else if(temp[j] >= 'A' && temp[j] <= 'Z'){
ok = false;
break;
}
}
ans[i] = curr->isEnd && ok;
}
return ans;
}
};
main(){
vector<string> v1 = {"FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"};
Solution ob;
print_vector(ob.camelMatch(v1, "FB"));
}输入项
["FooBar","FooBarTest","FootBall","FrameBuffer","ForceFeedBack"] "FB"
输出结果
[1, 0, 1, 1, 0, ]