• 字符串匹配算法 【微软面试100题 第三十三题】


    题目要求:

      给一串很长字符串,要求找到符合要求的字符串。

      例如目的串:123,则1*****3***2,12*****3这些都要找出来。

      其实就是类似一些和谐系统。。。。。。

    题目分析:

      1.假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d4d4jkfd4jd3kdf2",则应该输出  "4fsdfk2jfl3","2jfksd3jld4","4jd3kdf2".

      2.使用c++中的map<字符,个数>,先把目的串的每个字符都存入map中,且每个字符的个数初始化为1.然后逐个遍历长字符串中的字符,如果该字符在map中有存储且个数为1,则num加1,当num=N时,说明已经找到了N个目的串中的字符,可以输出了,输出之后又把map等变量重新初始化。startFlag=1表示这一次遍历还没有找到长字符串中的字符匹配到目的串中的字符,当第一次匹配时,则把startFlag=0.同时startPos更新,startPos表示某一次遍历时第一次匹配时的位置。

    代码实现:

    #include <iostream>
    #include <map>
    
    using namespace std;
    
    const int N = 3;
    
    void Handle(char *inputStr,char *desStr);
    
    int main(void)
    {
        char input[] = {"4fsdfk2jfl3fd2jfksd3j4d4d4jkfd4jd3kdf2"};
        char des[] = "423";
    
        Handle(input,des);
        
        return 0;
    }
    void PrintStr(char *start,char *end)
    {
        while(start != end)
        {
            cout << *start;
            start++;
        }
        cout << *end;
        cout << endl;
    }
    void InitHash(map<char,int> &hash,char *str)
    {
        while(*str != '')
        {
            hash[*str] = 1;
            str++;
        }
    }
    void Handle(char *inputStr,char *desStr)
    {
        if(inputStr==NULL || desStr==NULL)
            return ;
    
        map<char,int> hash;
        InitHash(hash,desStr);
    
        int startFlag = 1,num = 0;
        char *startPos;
        map<char,int>::iterator iter;
    
        while(*inputStr != '')
        {
            iter = hash.find(*inputStr);
            if(iter != hash.end())
            {
                if((*iter).second == 1)
                {
                    if(startFlag)
                    {
                        startPos = inputStr;
                        startFlag = 0;
                    }
                    ++hash[*inputStr];
                    num++;
                    if(num==3)
                    {
                        PrintStr(startPos,inputStr);
                        //重新初始化
                        num=0;
                        InitHash(hash,desStr);
                        startFlag = 1;
                    }
                }
                //第一个匹配字符连续出现时,选择最后一个
                //如选择输出"4jd3kdf2"而不是"4d4d4jkfd4jd3kdf2",因为第一个匹配的为4,有多个
                //连续的4,选最后一个
                else if(*startPos == *inputStr)
                {
                    startPos = inputStr;
                }
            }
            inputStr++;
        }
    }
  • 相关阅读:
    使用fiddler进行app弱网测试
    弱网测试
    Java虚拟机的内存模型
    Junit使用
    python安装numpy和scipy的资源
    HTTP资源合集
    http之post方法 提交数据的四种方法
    计算机编码中的换行 CR与LF
    python Mixin 是个啥?
    python mock的简单使用
  • 原文地址:https://www.cnblogs.com/tractorman/p/4064054.html
Copyright © 2020-2023  润新知