一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 446|回复: 6
收起左侧

[算法题] Regular expression matching的疑问

[复制链接] |试试Instant~ |关注本帖
glaciersilent 发表于 2015-8-1 09:39:57 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

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


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

补充内容 (2015-8-2 12:40):
见四楼。。
zhuli19901106 发表于 2015-8-1 15:59:46 | 显示全部楼层
本帖最后由 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)*弄混了,所以空串不匹配。
回复 支持 1 反对 0

使用道具 举报

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:25:10 | 显示全部楼层
本帖最后由 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模式下,未初始化的变量通常也会被填上一 ...

多谢~ 学习了~
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-7 23:29

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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