查看: 1584| 回复: 6
跳转到指定楼层
上一主题 下一主题
收起左侧

Regular expression matching的疑问

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
有个test case {“”,“..*”},要求的是返回false,可是我觉得按题目的规则应该是返回true啊。对于像{"","aaaaaaaaaaaaaaa*"}这样的现有的几种代码也是会返回false符合OJ的要求,可是我觉得这应该也是true才对啊,请大家指点下是我对规则的理解有问题还是怎么。Thanks~


补充内容 (2015-8-2 12:39):
发一个补充的疑问 ,关于C++的array初始化。

补充内容 (2015-8-2 12:40):
见四楼。。

上一篇:关于DP
下一篇:求助求助:interval schedule, n room for most number of meetings with priority
全局:
本帖最后由 zhuli19901106 于 2015-8-1 16:01 编辑

楼主可能还没理解元字符的规则,是这样的:
比如*表示匹配0~无穷多次
那么
1. a*表示0~无穷多个'a'
2. (ab)*表示0~无穷多个"ab"
3. (a*b)*表示0~无穷多个(0~无穷多个‘a’,后面再跟一个‘b’)
4. 更复杂的例子都可以通过递归定义得到。

.表示任意一个字符
1. .匹配任意单个字符
2. a.表示'a'后面随便跟一个字符
3. .*表示0~无穷多个随便什么字符,也就是匹配任何字符串
4. a*.表示0~无穷多个‘a’之后随便跟一个字符。比如ab可以,a可以,b可以,aaa可以,ba不行,空串也不行。
5. (a.)*表示0~无穷多个('a'之后随便跟一个字符),比如‘abacadaeaxay’

aaaaaaaaaaaaaaa*里面,那个星号只管最后一个'a',不要和(aaaaaaaaaaaaaaa)*弄混了,所以空串不匹配。
回复

使用道具 举报

🔗
zzj 2015-8-1 15:04:58 | 只看该作者
全局:
*不是表示0个以上么。。为啥会是true?
回复

使用道具 举报

🔗
 楼主| glaciersilent 2015-8-1 21:15:19 | 只看该作者
全局:
zhuli19901106 发表于 2015-8-1 15:59
楼主可能还没理解元字符的规则,是这样的:
比如*表示匹配0~无穷多次
那么

多谢多谢 犯了个很二的错误
回复

使用道具 举报

🔗
 楼主| glaciersilent 2015-8-2 12:47:42 | 只看该作者
全局:
有个代码有些疑问,代码如下:
  1. bool isMatch(string s, string p) {
  2.         bool arr[s.length()+1][p.length()+1]={false};//此处有疑问
  3.         arr[0][0]=true;
  4.         if(p.length()>0&&p.at(0)=='*')
  5.             return false;
  6.         for(int i=1;i<=p.length();i++){
  7.             if(p.at(i-1)=='*')
  8.                 arr[0][i]=arr[0][i-2];
  9.         }
  10.         for(int i=1;i<=s.length();i++){
  11.             for(int j=1;j<=p.length();j++){
  12.                 if(p.at(j-1)!='*'){
  13.                     if(s.at(i-1)==p.at(j-1)||p.at(j-1)=='.')
  14.                         arr[i][j]=arr[i-1][j-1];
  15.                     else
  16.                         arr[i][j]=false;
  17.                 }
  18.                 else{
  19.                     if(p.at(j-2)!=s.at(i-1)&&p.at(j-2)!='.')
  20.                         arr[i][j]=arr[i][j-2];
  21.                     else
  22.                         arr[i][j]=arr[i-1][j]||arr[i][j-2];
  23.                 }
  24.             }
  25.         }
  26.         return arr[s.length()][p.length()];
  27.     }
复制代码
bool arr[s.length()+1][p.length()+1]={false};会有case报错(应为false但返回为true),分析原因就出现在这个array并没有被全部置为false。
但是改成bool arr[s.length()+1][p.length()+1]={};反而可以AC, c++的array如果未初始化不是都是随机值么?这个现象让我比较困惑,继续求指教~~Thanks~~
回复

使用道具 举报

全局:
本帖最后由 zhuli19901106 于 2015-8-2 13:31 编辑
glaciersilent 发表于 2015-8-2 12:47
有个代码有些疑问,代码如下:bool arr[s.length()+1]={false};会有case报错(应为false但返回为true),分 ...

如果你用IDE调试过,应该是有Debug、Release模式之分的。
Debug模式下,未初始化的变量通常也会被填上一些特殊值(比如0xcccccccc是”烫烫“,用来检查数组越界)。我试了试我的VS,其他的codeblocks、eclipse、G++、cygwin神马的可能值会不一样,但道理是大同小异的。
我在debug模式下发现数组没初始化的部分都是false。

Release模式下,则默认你程序都调好了,而且已经避开了未定义行为。所以编译器就不帮你做默认初始化的事了,数组下面没初始化的部分都是乱的,有true有false。
可以在俩模式下看看这些数据里面的内容。另外,好的编程习惯应该保证完全的(所以部分初始化列表不好)、明确的初始化(有时默认构造函数就帮你初始化了,所以不用额外写代码),比如vector的构造、resize函数,或者数组的fill、memset。避开这些未定义行为才是最靠谱的
  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.     bool a[3][4] = {};
  6.     bool b[3][4] = {false};
  7.     bool c[3][4] = {true};
  8.     bool d[3][4] = {{false, true}};
  9.     bool e[3][4];
  10.    
  11.     return 0;
  12. }
复制代码
回复

使用道具 举报

🔗
 楼主| glaciersilent 2015-8-2 21:58:42 | 只看该作者
全局:
zhuli19901106 发表于 2015-8-2 13:25
如果你用IDE调试过,应该是有Debug、Release模式之分的。
Debug模式下,未初始化的变量通常也会被填上一 ...

多谢~ 学习了~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表