字符串通配符匹配-2014华为机试题目
2014-03-30 21:41
274 查看
题目:子串匹配母串,如果匹配,输出子串匹配的起始位置,否则输出-1。?可以代表一个字符,*代表一个或者多个。
从键盘输入,先输入子串,再输入母串。子串母串长度均小于20。运行时间和内存无限制。
一开始打开用KMP或BM算法来做,考试电脑可以上网,可以去查,但是子串有了通配符,next函数好像无法求(还没想到),所以暴力求解,可惜当时没调试出来。
思路:用一个find函数来找。
其中,start1是子串匹配的其实位置,start2是母串匹配的其实位置。加上这两个参数是为了递归调用,如果子串遇到通配符*,要递归调用(*后面的再和母串某个位置之后的串匹配)。大概思路就是这样,要调试好,还是要花一些时间。
代码如下:
从键盘输入,先输入子串,再输入母串。子串母串长度均小于20。运行时间和内存无限制。
一开始打开用KMP或BM算法来做,考试电脑可以上网,可以去查,但是子串有了通配符,next函数好像无法求(还没想到),所以暴力求解,可惜当时没调试出来。
思路:用一个find函数来找。
int find(char *substr,int start1,char *str,int start2)
其中,start1是子串匹配的其实位置,start2是母串匹配的其实位置。加上这两个参数是为了递归调用,如果子串遇到通配符*,要递归调用(*后面的再和母串某个位置之后的串匹配)。大概思路就是这样,要调试好,还是要花一些时间。
代码如下:
#include<iostream> using namespace std; int find(char *substr,int start1,char *str,int start2) { int length1=strlen(substr);//子串长度 int length2=strlen(str);//母串长度 int result=-1;//最终要返回的结果 int current; for(int i=start2;i<=length2;i++)//start2为母串搜索的其实位置 { if(i==length2+1)//搜索失败 return -1; result=i; current=i; for(int k=start1;k<=length1;k++)//start1为子串搜索的其实位置 { if(k==length1-1) return result; if(substr[k]==str[current]||substr[k]=='?') { current++; } else if(substr[k]=='*')//遇到*通配符,代表任何一个或者多个或者0个字符 { if(-1==find(substr,k+1,str,current)) return -1; else return result; } else break; } } } int main() { char *substr=(char*)malloc(21*sizeof(char)); char *str=(char*)malloc(21*sizeof(char)); cin>>substr; cin>>str; cout<<find(substr,0,str,0); return 0; }
相关文章推荐
- 算法思维——字符串压缩程序(华为2014校园招聘的机试题目)
- 华为2014机试字符串压缩
- 2014华为机试-在字符串中找出连续最长的数字串
- 华为2014机试字符串压缩
- 9月5日 华为2014校园招聘的机试题目_C语言版答案
- 2014华为机试题目
- 2014华为校园招聘机试——字符串过滤、压缩等
- 2014华为机试题目
- 2014华为机试-判断输入的字符串是不是一个有效的IP地址
- 2014华为校招机试题目总结
- 华为2014机试题目
- 华为机试——字符串中括号是否匹配
- 2014华为机试-字符串替换
- [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
- 华为机试:简单密码破解、字符串通配符
- 华为code中的字符串通配符匹配
- 华为机试 题目2 - 字符串过滤
- 华为机试题目:识别字符串中的整数并转换为数字形式
- OJ——华为编程题目:输入字符串括号是否匹配
- 2014华为机试-字符串替换