字符串匹配算法 【微软面试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 != '\0')
    {
        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 != '\0')
    {
        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++;
    }
}

 

点赞