字符串的匹配
腾讯的一道面试题:
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。 如:“J* Smi??” 可以匹配“John Smith” .
请用C语言实现如下函数: void scan(const char* pszText, const char* pszName);
注:pszText为整个文章字符,pszName为要求匹配的英文名。
请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。
#include <iostream> #include <cstring> using namespace std; const char *pszTest="John Smithh"; const char *pszName="J* Smi??"; void scan(const char* pszText, const char* pszName){ int flag=0;//下一次匹配的起始位置。 int i=0; int j=0; while(i<strlen(pszTest)||j<strlen(pszName)){ if(i>=strlen(pszTest)){ cout<<"匹配失败"; return; } if(j>=strlen(pszName)){ cout<<"匹配成功"; j=0; return; } if(pszTest[i]==pszName[j]||pszName[j]=='?'){ //如果相等或者pszName中是通配符‘?’时,都认为是匹配成功,继续匹配; i++; j++; continue; } if(pszName[j]=='*'){ j++;//跳过‘*’,继续匹配直到下一个字符匹配上为止 while(pszTest[i++]!=pszName[j]&&i<strlen(pszTest)); j++;//找到匹配的字符之后,j也向后移动一位。 continue; } j=0;//匹配失败,子串重新开始匹配。 flag++; i=flag;//匹配失败,目标串返回flag指定的位置。 } //用于两个字符串都恰好匹配完的情况! cout<<"匹配成功"; } int main() { scan(pszTest,pszName); return 0; }
每天明白一点知识