字符串匹配算法 【微软面试100题 第三十三题】
2014-11-05 15:04
225 查看
题目要求:
给一串很长字符串,要求找到符合要求的字符串。
例如目的串:123,则1*****3***2,12*****3这些都要找出来。
其实就是类似一些和谐系统。。。。。。
题目分析:
1.假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d4d4jkfd4jd3kdf2",则应该输出 "[b]4fsdfk2jfl3","[b]2jfksd3jld4","[b]4jd3kdf2".[/b][/b][/b]
2.使用c++中的map<字符,个数>,先把目的串的每个字符都存入map中,且每个字符的个数初始化为1.然后逐个遍历长字符串中的字符,如果该字符在map中有存储且个数为1,则num加1,当num=N时,说明已经找到了N个目的串中的字符,可以输出了,输出之后又把map等变量重新初始化。startFlag=1表示这一次遍历还没有找到长字符串中的字符匹配到目的串中的字符,当第一次匹配时,则把startFlag=0.同时startPos更新,startPos表示某一次遍历时第一次匹配时的位置。
代码实现:
给一串很长字符串,要求找到符合要求的字符串。
例如目的串:123,则1*****3***2,12*****3这些都要找出来。
其实就是类似一些和谐系统。。。。。。
题目分析:
1.假如目的串为:"423",输入长字符串为:"4fsdfk2jfl3fd2jfksd3j4d4d4jkfd4jd3kdf2",则应该输出 "[b]4fsdfk2jfl3","[b]2jfksd3jld4","[b]4jd3kdf2".[/b][/b][/b]
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++; } }
相关文章推荐
- 微软面试100题:字符串匹配算法,查找包含字符集的子串
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 微软等数据结构+算法面试100题(29)--在字符串中删除特定的字符
- 微软等数据结构+算法面试100题(6)--写一个函数,检查字符是否是整数,如果是,返回其整数值
- 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题
- [整理III]微软等数据结构+算法面试100题[最新第61-80题]
- 算法面试:精选微软经典的算法面试100题
- [答案V0.1版]精选微软等数据结构+算法面试100题 [前20题]
- [答案V0.1版]精选微软等数据结构+算法面试100题 [前20题]
- [答案V0.1版]精选微软等数据结构+算法面试100题 [前20题]
- [整理III]微软等数据结构+算法面试100题[最新第61-80题]
- 算法面试:精选微软等公司经典的算法面试100题 第26-35题
- 算法面试:精选微软经典的算法面试100题(第21-25题)
- 算法面试:精选微软等公司经典的算法面试100题 第26-35题
- 算法面试:精选微软等公司经典的算法面试100题 第1-40题
- [最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案]
- 算法面试:精选微软经典的算法面试100题(第1-20题)
- 算法面试:精选微软经典的算法面试100题(第21-25题)
- [最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案]
- [最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案]