zoukankan      html  css  js  c++  java
  • 字符串的匹配

    腾讯的一道面试题:

    在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。 如:“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;
    }
  • 相关阅读:
    NGBOSS转型在即:COTS初露锋芒
    [原]CmsEasy安装,后台“内容管理”页面空白
    CentOS5安装mcrypt问题
    [转]Grub安装修复
    [转]BOSS3接近尾声
    多渠道整合开启NGBOSS第一步
    [原][转]TUXEDO与ORACLE数据库的互连
    [译]Oracle Data Cartridge| Oracle数据筒介绍
    [译]ORACLE数据弹药桶(Data Cartridge)简介
    [原]再说精度用于显示的数字出现精度问题的处理(Perl/Java)
  • 原文地址:https://www.cnblogs.com/wft1990/p/6946480.html
Copyright © 2011-2022 走看看