m*t
2 楼
嗯,下个月的够了。
G*r
3 楼
1. 第一次在这里去 Morel Morel hunting。 周六同 J 一块开车1小时去他以前采摘过
的地方。这是找到的 Morels:
2. 清洗了的一部分。
3 找到的一颗大的
4. 觉得脖子上有什么东西再爬。用手抓来一看。是一个 Deer Tick。 就是携带Lime
disease的那种。很是恶心。
5. 走进树林不到3分钟发现了我的第一个Yellow Morel:
6. 你能看见吗?
7. 漂亮的 Morel
8. Another One
9. 森林照片
10. 一对 Morels
11。 Big one
12. Morel 在哪儿?
13. 在这儿:
昨晚 Morel 炒肉吃了。Delicious。那味道颗真鲜。今天我还活着能 Post。 说明没有
毒。
哈哈。
好啦。Morel 的季节很短。今天还准备去找找。天亮了。准备出发了。回来再聊,回答
问题。
的地方。这是找到的 Morels:
2. 清洗了的一部分。
3 找到的一颗大的
4. 觉得脖子上有什么东西再爬。用手抓来一看。是一个 Deer Tick。 就是携带Lime
disease的那种。很是恶心。
5. 走进树林不到3分钟发现了我的第一个Yellow Morel:
6. 你能看见吗?
7. 漂亮的 Morel
8. Another One
9. 森林照片
10. 一对 Morels
11。 Big one
12. Morel 在哪儿?
13. 在这儿:
昨晚 Morel 炒肉吃了。Delicious。那味道颗真鲜。今天我还活着能 Post。 说明没有
毒。
哈哈。
好啦。Morel 的季节很短。今天还准备去找找。天亮了。准备出发了。回来再聊,回答
问题。
b*u
4 楼
记录此前最后一个*,如果当前不匹配了则用那个*覆盖到现在,这样总共是 O(n)
C*g
5 楼
same here in VA
l*d
8 楼
太诱人了,今年我一直找不到,决定今天再去找!
b*m
9 楼
大牛们给评价一下我下面的code,匆匆写的,没用太多case验证:
bool IsStringMatch(char *pattern, char *string)
{
if( !pattern || !string ) return false;
char *laststar = NULL;
while( *pattern && *string )
{
if( *pattern == '*' )
laststar = pattern;
else
{
if( *pattern != *string && *pattern != '?' )
{
if( laststar )
pattern = laststar;
else
return false;
}
}
pattern++;
string++;
}
if( *pattern || *string )
return false;
else
return true;
}
bool IsStringMatch(char *pattern, char *string)
{
if( !pattern || !string ) return false;
char *laststar = NULL;
while( *pattern && *string )
{
if( *pattern == '*' )
laststar = pattern;
else
{
if( *pattern != *string && *pattern != '?' )
{
if( laststar )
pattern = laststar;
else
return false;
}
}
pattern++;
string++;
}
if( *pattern || *string )
return false;
else
return true;
}
p*8
10 楼
太厉害了,知识就是美食
x*8
14 楼
采蘑菇的大兄弟,背着一只大罗筐,手里举着小手机呀,边找蘑菇边照相,啦啦啦 ...
哈哈
哈哈
h*n
15 楼
leetcode大牛前面写过一篇文章,貌似O(n)是不可能的
http://www.mitbbs.com/article_t/JobHunting/31715957.html
【在 b*****u 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 记录此前最后一个*,如果当前不匹配了则用那个*覆盖到现在,这样总共是 O(n)
http://www.mitbbs.com/article_t/JobHunting/31715957.html
【在 b*****u 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 记录此前最后一个*,如果当前不匹配了则用那个*覆盖到现在,这样总共是 O(n)
h*n
17 楼
下面这些过不了
"aa", "*"
"", "*"
"a", "a*"
"a", "?*"
"ab", "*ab"
"mississippi", "m*si*"
"mississippi", "m*iss*"
"mississippi", "m*iss*iss*"
【在 b***m 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 大牛们给评价一下我下面的code,匆匆写的,没用太多case验证:
: bool IsStringMatch(char *pattern, char *string)
: {
: if( !pattern || !string ) return false;
:
: char *laststar = NULL;
:
: while( *pattern && *string )
: {
: if( *pattern == '*' )
"aa", "*"
"", "*"
"a", "a*"
"a", "?*"
"ab", "*ab"
"mississippi", "m*si*"
"mississippi", "m*iss*"
"mississippi", "m*iss*iss*"
【在 b***m 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 大牛们给评价一下我下面的code,匆匆写的,没用太多case验证:
: bool IsStringMatch(char *pattern, char *string)
: {
: if( !pattern || !string ) return false;
:
: char *laststar = NULL;
:
: while( *pattern && *string )
: {
: if( *pattern == '*' )
p*2
19 楼
我觉得这题面试最好还是用DP来解。
public boolean isMatch(String s, String p)
{
int n=s.length();
int m=p.length();
boolean[][] dp=new boolean[2][n+1];
dp[m%2][n]=true;
for(int i=m-1;i>=0;i--)
{
Arrays.fill(dp[i%2], false);
if(p.charAt(i)=='*')
for(int j=n;j>=0;j--)
{
if(dp[(i+1)%2][j])
for(int k=0;k<=j;k++)
dp[i%2][k]=true;
}
else
for(int j=n-1;j>=0;j--)
dp[i%2][j]=(p.charAt(i)==s.charAt(j) || p.charAt(i)=='?'
) && dp[(i+1)%2][j+1];
}
return dp[0][0];
}
public boolean isMatch(String s, String p)
{
int n=s.length();
int m=p.length();
boolean[][] dp=new boolean[2][n+1];
dp[m%2][n]=true;
for(int i=m-1;i>=0;i--)
{
Arrays.fill(dp[i%2], false);
if(p.charAt(i)=='*')
for(int j=n;j>=0;j--)
{
if(dp[(i+1)%2][j])
for(int k=0;k<=j;k++)
dp[i%2][k]=true;
}
else
for(int j=n-1;j>=0;j--)
dp[i%2][j]=(p.charAt(i)==s.charAt(j) || p.charAt(i)=='?'
) && dp[(i+1)%2][j+1];
}
return dp[0][0];
}
p*2
27 楼
你再仔细看看。不过我可以换一种写法就更清楚了。
public boolean isMatch(String s, String p)
{
int n=s.length();
int m=p.length();
boolean[][] dp=new boolean[2][n+1];
dp[m%2][n]=true;
for(int i=m-1;i>=0;i--)
{
Arrays.fill(dp[i%2], false);
dp[i%2][n]=p.charAt(i)=='*' && dp[(i+1)%2][n];
for(int j=n-1;j>=0;j--)
if(p.charAt(i)=='*')
dp[i%2][j]=dp[(i+1)%2][j] || dp[i%2][j+1];
else
dp[i%2][j]=(p.charAt(i)==s.charAt(j) || p.charAt(i)=='?'
) && dp[(i+1)%2][j+1];
}
return dp[0][0];
}
【在 h****n 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 三个for套一起了,最坏情况下会是n^3吧?
w*e
28 楼
太赞了!羡慕!您在什么地区?我们这儿还早。
l*d
30 楼
湖人真是贵人,今天到树林里去居然找着了morel。不多,只有七个,很满足了,呵呵
i*e
31 楼
longway2008 贴过的代码,估计是我看过非递归解法最短的行数了。。。但不好消化
bool isMatch(const char *str, const char *pat, bool hasStar=false)
{
if (!*pat) return !*str || hasStar;
const char *s, *p;
for (s = str, p = pat; *s; ++s, ++p) {
if (*p == '*')
return isMatch(s, p+1, true);
else if ( *p != '?' && *s != *p)
return !hasStar ? false : isMatch(str+1, pat, hasStar);
}
while (*p == '*') ++p;
return (!*p);
}
bool isMatch(const char *str, const char *pat, bool hasStar=false)
{
if (!*pat) return !*str || hasStar;
const char *s, *p;
for (s = str, p = pat; *s; ++s, ++p) {
if (*p == '*')
return isMatch(s, p+1, true);
else if ( *p != '?' && *s != *p)
return !hasStar ? false : isMatch(str+1, pat, hasStar);
}
while (*p == '*') ++p;
return (!*p);
}
p*2
33 楼
这个不是递归吗?
【在 i**********e 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: longway2008 贴过的代码,估计是我看过非递归解法最短的行数了。。。但不好消化
: bool isMatch(const char *str, const char *pat, bool hasStar=false)
: {
: if (!*pat) return !*str || hasStar;
:
: const char *s, *p;
: for (s = str, p = pat; *s; ++s, ++p) {
: if (*p == '*')
: return isMatch(s, p+1, true);
: else if ( *p != '?' && *s != *p)
G*r
34 楼
四月30号 Morel Hunting:
今天收获不多, 20来颗。主要是不熟悉地形和植被。瞎闯。瞎猫碰着死老鼠呗。在树
林里走沿着很陡的坡上上下下。喝了几乎一加仑的水。
熊不少哦。有警告。还有新鲜的熊的排泄物。不过黑熊不可怕。一个人能对付一只熊。
我有一把Machete。
不知道是什么蝴蝶。很漂亮。
今天收获不多, 20来颗。主要是不熟悉地形和植被。瞎闯。瞎猫碰着死老鼠呗。在树
林里走沿着很陡的坡上上下下。喝了几乎一加仑的水。
熊不少哦。有警告。还有新鲜的熊的排泄物。不过黑熊不可怕。一个人能对付一只熊。
我有一把Machete。
不知道是什么蝴蝶。很漂亮。
h*n
37 楼
我的递归版本
bool isMatch(const char *s, const char *p) {
if(*s=='\0')
{
if(*p=='\0') return true;
while(*p)
{
if(*p!='*') return false;
p++;
}
return true;
}
if(*p=='*') return isMatch(s+1,p) || isMatch(s,p+1);
else return (*p=='?'||*p==*s)?isMatch(s+1,p+1):false;
}
【在 i**********e 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: longway2008 贴过的代码,估计是我看过非递归解法最短的行数了。。。但不好消化
: bool isMatch(const char *str, const char *pat, bool hasStar=false)
: {
: if (!*pat) return !*str || hasStar;
:
: const char *s, *p;
: for (s = str, p = pat; *s; ++s, ++p) {
: if (*p == '*')
: return isMatch(s, p+1, true);
: else if ( *p != '?' && *s != *p)
bool isMatch(const char *s, const char *p) {
if(*s=='\0')
{
if(*p=='\0') return true;
while(*p)
{
if(*p!='*') return false;
p++;
}
return true;
}
if(*p=='*') return isMatch(s+1,p) || isMatch(s,p+1);
else return (*p=='?'||*p==*s)?isMatch(s+1,p+1):false;
}
【在 i**********e 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: longway2008 贴过的代码,估计是我看过非递归解法最短的行数了。。。但不好消化
: bool isMatch(const char *str, const char *pat, bool hasStar=false)
: {
: if (!*pat) return !*str || hasStar;
:
: const char *s, *p;
: for (s = str, p = pat; *s; ++s, ++p) {
: if (*p == '*')
: return isMatch(s, p+1, true);
: else if ( *p != '?' && *s != *p)
h*n
49 楼
回头研究一下二爷的DP
leetcode的OJ搞得真不错,收获很大,希望多加些有代表性的新题做做,谢谢
leetcode的OJ搞得真不错,收获很大,希望多加些有代表性的新题做做,谢谢
y*2
58 楼
真不错!长知识:)
h*n
59 楼
试过了二爷的C++版本,还是超时了,谁贴个能通过OJ大test case的版本
bool isMatch(const char *s, const char *p)
{
int i,j;
int n=0,m=0;
const char* tmp;
tmp = s;
while(*tmp++)n++;
tmp = p;
while(*tmp++)m++;
vector > dp(2,vector(n+1, false));
dp[m%2][n] = true;
for(i=m-1;i>=0;i--)
{
dp[i%2].assign(n+1, false);
dp[i%2][n] = (p[i]=='*'&&dp[(i+1)%2][n]);
for(j=n-1;j>=0;j--)
if(p[i]=='*')
dp[i%2][j] = dp[(i+1)%2][j]||dp[i%2][j+1];
else
dp[i%2][j] = (p[i]==s[j]||p[i]=='?')
&&dp[(i+1)%2][j+1];
}
return dp[0][0];
}
bool isMatch(const char *s, const char *p)
{
int i,j;
int n=0,m=0;
const char* tmp;
tmp = s;
while(*tmp++)n++;
tmp = p;
while(*tmp++)m++;
vector
dp[m%2][n] = true;
for(i=m-1;i>=0;i--)
{
dp[i%2].assign(n+1, false);
dp[i%2][n] = (p[i]=='*'&&dp[(i+1)%2][n]);
for(j=n-1;j>=0;j--)
if(p[i]=='*')
dp[i%2][j] = dp[(i+1)%2][j]||dp[i%2][j+1];
else
dp[i%2][j] = (p[i]==s[j]||p[i]=='?')
&&dp[(i+1)%2][j+1];
}
return dp[0][0];
}
i*e
63 楼
你可以看看我这个是不是跟你一样的啊?
为什么large case 里错了两三个(除掉最后一个 TLE 的case 之外)?
bool isMatch(const char *s, const char *p) {
int n=strlen(s);
int m=strlen(p);
bool dp[2][n+1];
for (int i = 0; i < 1; i++) {
for (int j = 0; j < n+1; j++)
dp[i][j] = false;
}
dp[m%2][n]=true;
for(int i=m-1;i>=0;i--)
{
for (int j=0;j dp[i%2][j] = false;
}
dp[i%2][n]=(p[i]=='*' && dp[(i+1)%2][n]);
for(int j=n-1;j>=0;j--)
if(p[i]=='*')
dp[i%2][j]=(dp[(i+1)%2][j] || dp[i%2][j+1]);
else
dp[i%2][j]=((p[i]==s[j] || p[i]=='?') && dp[(i+1)%2][j+1
]);
}
return dp[0][0];
}
PS: 这个DP不能过了,最后的test 是 m=32k, n=32k,所以 O(MN) 的算法都过不了了。
【在 h****n 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 试过了二爷的C++版本,还是超时了,谁贴个能通过OJ大test case的版本
: bool isMatch(const char *s, const char *p)
: {
: int i,j;
: int n=0,m=0;
: const char* tmp;
: tmp = s;
: while(*tmp++)n++;
: tmp = p;
: while(*tmp++)m++;
为什么large case 里错了两三个(除掉最后一个 TLE 的case 之外)?
bool isMatch(const char *s, const char *p) {
int n=strlen(s);
int m=strlen(p);
bool dp[2][n+1];
for (int i = 0; i < 1; i++) {
for (int j = 0; j < n+1; j++)
dp[i][j] = false;
}
dp[m%2][n]=true;
for(int i=m-1;i>=0;i--)
{
for (int j=0;j
}
dp[i%2][n]=(p[i]=='*' && dp[(i+1)%2][n]);
for(int j=n-1;j>=0;j--)
if(p[i]=='*')
dp[i%2][j]=(dp[(i+1)%2][j] || dp[i%2][j+1]);
else
dp[i%2][j]=((p[i]==s[j] || p[i]=='?') && dp[(i+1)%2][j+1
]);
}
return dp[0][0];
}
PS: 这个DP不能过了,最后的test 是 m=32k, n=32k,所以 O(MN) 的算法都过不了了。
【在 h****n 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 试过了二爷的C++版本,还是超时了,谁贴个能通过OJ大test case的版本
: bool isMatch(const char *s, const char *p)
: {
: int i,j;
: int n=0,m=0;
: const char* tmp;
: tmp = s;
: while(*tmp++)n++;
: tmp = p;
: while(*tmp++)m++;
h*n
64 楼
额,一旦出现TLE我这里没法显示之前通过或者没通过的那些cases。。试了几个浏览器
都不行
【在 i**********e 的大作中提到】![](/moin_static193/solenoid/img/up.png)
: 你可以看看我这个是不是跟你一样的啊?
: 为什么large case 里错了两三个(除掉最后一个 TLE 的case 之外)?
: bool isMatch(const char *s, const char *p) {
: int n=strlen(s);
: int m=strlen(p);
: bool dp[2][n+1];
: for (int i = 0; i < 1; i++) {
: for (int j = 0; j < n+1; j++)
: dp[i][j] = false;
: }
都不行
【在 i**********e 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 你可以看看我这个是不是跟你一样的啊?
: 为什么large case 里错了两三个(除掉最后一个 TLE 的case 之外)?
: bool isMatch(const char *s, const char *p) {
: int n=strlen(s);
: int m=strlen(p);
: bool dp[2][n+1];
: for (int i = 0; i < 1; i++) {
: for (int j = 0; j < n+1; j++)
: dp[i][j] = false;
: }
p*2
73 楼
不过感觉C++写起来还是比Java罗嗦一些。不过C++有指针,有些题就做的很灵活,
简洁。
简洁。
b*m
78 楼
给你发站内邮件了哦。
l*a
80 楼
p*2
81 楼
感觉挺麻烦呀。
【在 l*****a 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 这里有个非递归的。
: http://blog.csdn.net/hopeztm/article/details/8039777
b*m
82 楼
这个想写好还真不容易,看来我今天做题也不算太差。
l*8
83 楼
刚才写了这个,通过了leetcode大数据量测试
bool isMatch(const char *s, const char *p) {
if (!p) return !s;
if (!s) return !p;
for (const char *star=NULL, *s_save=s; *s; ) {
if (*p == '*') {
star = p++;
s_save = s;
} else if ( *p != '?' && *s != *p) {
if (!star) {
return false;
} else {
p = star+1;
s = ++s_save;
}
} else {
s++;
p++;
}
}
while (*p == '*') p++;
return !*p;
}
bool isMatch(const char *s, const char *p) {
if (!p) return !s;
if (!s) return !p;
for (const char *star=NULL, *s_save=s; *s; ) {
if (*p == '*') {
star = p++;
s_save = s;
} else if ( *p != '?' && *s != *p) {
if (!star) {
return false;
} else {
p = star+1;
s = ++s_save;
}
} else {
s++;
p++;
}
}
while (*p == '*') p++;
return !*p;
}
p*2
85 楼
longway,你写这个大概花了多少时间呀?
【在 l*********8 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 刚才写了这个,通过了leetcode大数据量测试
: bool isMatch(const char *s, const char *p) {
: if (!p) return !s;
: if (!s) return !p;
: for (const char *star=NULL, *s_save=s; *s; ) {
: if (*p == '*') {
: star = p++;
: s_save = s;
: } else if ( *p != '?' && *s != *p) {
: if (!star) {
l*8
90 楼
我加了注释
bool isMatch(const char *s, const char *p) {
if (!p) return !s;
if (!s) return !p;
for (const char *star=NULL, *s_save=s; *s; ) {
// star是上一个*出现的位置;s_save+1是出现不匹配时,s应该回到的位置。
if (*p == '*') {
star = p++;
s_save = s;
} else if ( *p != '?' && *s != *p) { // 不匹配
if (!star) { // 没有*来做灵活匹配
return false;
} else { // 有*, 回到star+1 和 s_save+1匹配
p = star+1;
s = ++s_save;
}
} else { // 匹配时,p和s都前进到下一个
s++;
p++;
}
}
while (*p == '*') p++; // pattern结尾的*可以消耗掉
return !*p; // 看是否已经到p的末尾
}
【在 b***m 的大作中提到】![](/moin_static193/solenoid/img/up.png)
:
: 能简单总结一下思想吗?
bool isMatch(const char *s, const char *p) {
if (!p) return !s;
if (!s) return !p;
for (const char *star=NULL, *s_save=s; *s; ) {
// star是上一个*出现的位置;s_save+1是出现不匹配时,s应该回到的位置。
if (*p == '*') {
star = p++;
s_save = s;
} else if ( *p != '?' && *s != *p) { // 不匹配
if (!star) { // 没有*来做灵活匹配
return false;
} else { // 有*, 回到star+1 和 s_save+1匹配
p = star+1;
s = ++s_save;
}
} else { // 匹配时,p和s都前进到下一个
s++;
p++;
}
}
while (*p == '*') p++; // pattern结尾的*可以消耗掉
return !*p; // 看是否已经到p的末尾
}
【在 b***m 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
:
: 能简单总结一下思想吗?
b*m
92 楼
多谢!核心语句其实就是这句:
if (!star) { // 没有*来做灵活匹配
return false;
} else { // 有*, 回到star+1 和 s_save+1匹配
p = star+1;
s = ++s_save;
}
一旦不匹配又有过往的*,那么就把p回溯到上个*的下一个字符,把s回溯到p出现*时s
对应的下一个字符,对吗?
【在 l*********8 的大作中提到】
![](/moin_static193/solenoid/img/up.png)
: 我加了注释
: bool isMatch(const char *s, const char *p) {
: if (!p) return !s;
: if (!s) return !p;
: for (const char *star=NULL, *s_save=s; *s; ) {
: // star是上一个*出现的位置;s_save+1是出现不匹配时,s应该回到的位置。
: if (*p == '*') {
: star = p++;
: s_save = s;
: } else if ( *p != '?' && *s != *p) { // 不匹配
p*2
96 楼
我用Java写了一个,真是没有C++简洁呀。
public boolean isMatch(String s, String p)
{
int n=s.length();
int m=p.length();
int i=0;
int j=0;
int star=-1;
int sp=0;
while(i {
//one * and multiple *, same effect
while(j {
star=j++; //* match 0 character
sp=i;
}
if(j==m || (p.charAt(j)!=s.charAt(i) && p.charAt(j)!='?'))
{
if(star<0)
return false;
else
{
j=star+1;
i=++sp; //* match 1 character
}
}
else
{
i++;
j++;
}
}
while(j return j==m;
}
public boolean isMatch(String s, String p)
{
int n=s.length();
int m=p.length();
int i=0;
int j=0;
int star=-1;
int sp=0;
while(i
//one * and multiple *, same effect
while(j
star=j++; //* match 0 character
sp=i;
}
if(j==m || (p.charAt(j)!=s.charAt(i) && p.charAt(j)!='?'))
{
if(star<0)
return false;
else
{
j=star+1;
i=++sp; //* match 1 character
}
}
else
{
i++;
j++;
}
}
while(j
}
相关阅读