Description
我也不知道为什么一个easy题目,被我写出了荡气回肠余音绕梁的感觉TAT题目描述是这样的:亲爱的你有一个pattern 比如"abba" 还有一个字串用空格分隔的,比如"cat dog dog cat" 你现在要看这两个是不是匹配呀~
Errors
愚蠢的我出错了无数次,硬生生把leetcode用成了debug平台。出错的情况包括:
- 数组越界
- 逻辑错误。比如pattern是abba 最后是dog dog dog dog 我理解是可以的,但是实际上不行
- char 指针分配空间的时候没分配够【我现在觉得不如直接怼二维数组啊
- *str_list[i] == *str_list[j] 只比较了首字母,还是用strcmp吧亲爱的
最后在这道easy题下瑟瑟发抖,我觉得如果是面试都够我凉好几次了QAQ感觉我字符串操作基础好水啊,strcmp strcpy strtok 都是现查的。想写一个字符串指针的数组还忘了初始分配TAT 现在感觉自己malloc还不如一开始直接弄个二维数组呢TAT
Notes
- 我写的时候没有考虑pattern都是小写的情况。我的假设里面,pattern是非"\n"的单个char类型。
- 判断匹配两两比较的时候,我设置了一点trick. 如果pattern里面有两个相同,那么只需要比这两个是否相同,后一个pattern和其他元素都不用比较了——因为前一个相同的比较过了。所以这里我会把pattern修改成"\n"降低一些时间吧
TODO
现在分配新的空间的时候,是直接malloc长度1000的,可能很耗费空间。我感觉这边可以放一串int数组,类似索引指到str里面的某一个split的下标。然后中间的" “全部都弄成”\n"这样应该就有一样的效果,还省空间。
Code
bool wordPattern(char* pattern, char* str) {
// in order to use strtok function in C
// write in C instead of C++
// hhhhhhh
const char *split = " ";
int pattern_len = strlen(pattern);
if (pattern_len == 0) {
if (str==NULL) return true;
return false;
}
int str_len = 0;
char* str_list[pattern_len + 1];
for (int i = 0; i <= pattern_len; i++) {
str_list[i]=(char*)malloc(1000*sizeof(char));
}
char* p = strtok(str, split);
// str_len <= pattern_len
// memory overflow, corner case
while (p && (str_len <= pattern_len)) {
strcpy(str_list[str_len], p);
str_len++;
p = strtok(NULL, split);
}
if (str_len != pattern_len) return false;
for (int i = 0; i < str_len; i++) {
if (pattern[i] == '\n') continue;
for (int j = i + 1; j < str_len; j++) {
if (pattern[i] == pattern[j] && strcmp(str_list[i],str_list[j])!=0) {
return false;
}
// logical error
// Input: "abba" "dog dog dog dog"
// Output true
// Expected false
if (pattern[i] != pattern[j]
&& pattern[j] != "\n" && (strcmp(str_list[i],str_list[j])==0)) {
return false;
}
if (pattern[i] == pattern[j]) {
pattern[j] = '\n';
}
}
}
return true;
}
Update 2019.3.28
更新了一下。对于str按照空格拆分后得到的片段,存储方式改变了。之前是直接暴力存在一个字符串的二维数组里面,还都开辟了新的空间。现在就是记录下了索引位置,然后直接把空格改成’\0’达到了类似的目的。这样就是为了省空间吧。
bool wordPattern(char* pattern, char* str) {
int pattern_len = strlen(pattern);
if (pattern_len == 0) {
if (str==NULL) return true;
return false;
}
int str_len = 0;
int str_pointer_list[pattern_len + 1];
if (str[0] != '\n') {
str_pointer_list[0] = 0;
str_len++;
}
int length = strlen(str);
for (int i = 0; i < length - 1; i++) {
if (str[i] == ' ') {
if (str_len < pattern_len + 1)
str_pointer_list[str_len] = i + 1;
str_len++;
str[i] = '\0';
}
}
if (str_len != pattern_len) return false;
for (int i = 0; i < str_len; i++) {
if (pattern[i] == '\n') continue;
for (int j = i + 1; j < str_len; j++) {
if (pattern[i] == pattern[j]
&& strcmp(str + str_pointer_list[i], str + str_pointer_list[j])!=0) {
return false;
}
if (pattern[i] != pattern[j]
&& pattern[j] != '\n'
&& strcmp(str + str_pointer_list[i], str + str_pointer_list[j])==0) {
return false;
}
if (pattern[i] == pattern[j]) {
pattern[j] = '\n';
}
}
}
return true;
}