请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
2016-11-29 14:46
1911 查看
// test20.cpp : 定义控制台应用程序的入口点。
//
//
#include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<queue> #include<stack> #include<cstring> #include<string.h> #include<deque> #include <forward_list> using namespace std; //关于能否匹配可用递归的方式实现 //匹配上的情况 //1.下一位是*,分三种情况: //1.1 matchCore(str+1,pattern) 模式串匹配成功,并尝试匹配下一字符 //1.3 matchCore(str,pattern+2) 模式串未匹配 //2.下一位不是*,则pattern对应为应该与str相等或者pattern的对应为为. //matchCore(str+1, pattern + 1) //3.对应为不匹配,返回false class Solution { public: bool match(char* str, char* pattern) { if (str == NULL || pattern == NULL) return false; return matchCore(str,pattern); } bool matchCore(char* str, char* pattern) { if (*str == '\0'&&*pattern == '\0') return true; //迭代终止条件 if (*str != '\0'&&*pattern == '\0') return false;//迭代终止条件 if (*(pattern + 1) == '*') { if (*str == *pattern||(*pattern=='.'&&*str!='\0')) return matchCore(str + 1, pattern) || matchCore(str, pattern + 2); else return matchCore(str, pattern + 2); } if (*str == *pattern || (*pattern=='.'&&*str!='\0')) return matchCore(str+1,pattern+1); return false; } }; int main() { Solution so; char* str = "aaa"; //char* pattern1 = "a*"; // cout << "str的长度是:" << strlen(str) << endl; char* pattern1 = "ab*a*c*a"; char* pattern2 = "a.a"; char* pattern3 = "ab*a"; char* pattern4 = "aa.a"; char* pattern5 = "bbbba"; char* pattern6 = ".*a*a"; /*char* str = "aaa"; char* pattern1 = "bbbba";*/ //char* pattern1 = ""; // cout << "pattern1 匹配的结果是: " << so.match(str, pattern1) <<endl; cout << "pattern2 匹配的结果是: " << so.match(str, pattern2) << endl; cout << "pattern3 匹配的结果是: " << so.match(str, pattern3) << endl; cout << "pattern4 匹配的结果是: " << so.match(str, pattern4) << endl; cout << "pattern5 匹配的结果是: " << so.match(pattern5, pattern6) << endl; return 0; }
相关文章推荐
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.
- 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
- 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。
- 实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
- 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字
- 给一个字符串,例如”ababc",要求返回"ab"。因为"ab”连续重复出现且最长。用C/C++语言写一个函数完成该算法,给出复杂度
- 写一个函数判断字符串中"{"与"}","["与"]","("与")"匹配,"{"必须在"}"前面,"["必须在"]"前面,"("必须在")"前面,可以嵌套
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 实现简单的输入编辑,录入正确的字符串,出现‘$’,表示撤销前一个输入, 发现连续的‘$’,表示连续撤销前面的输入;发现‘%’,表示放弃前面所有录入; 生成最终结果。
- [剑指Offer-字符串]请实现一个函数用来找出字符流中第一个只出现一次的字符。
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1
- 输入一个字符串,要求输出字符串中字符所有的排列,例如输入"abc",得到"abc","acb","bca","bac","cab","cba"
- 已知一个序列seq=[a,b,....,z,aa,ab,...,zz,aaa,aab,....],求任意一个字符串s=[a-z]+在seq中出现的位置
- 正则表达式:匹配字符串中除了"abc"以外的所有其它部分