Leetcode 290. Word Pattern

Description

我也不知道为什么一个easy题目,被我写出了荡气回肠余音绕梁的感觉TAT题目描述是这样的:亲爱的你有一个pattern 比如"abba" 还有一个字串用空格分隔的,比如"cat dog dog cat" 你现在要看这两个是不是匹配呀~

Errors

愚蠢的我出错了无数次,硬生生把leetcode用成了debug平台。出错的情况包括:

  1. 数组越界
  2. 逻辑错误。比如pattern是abba 最后是dog dog dog dog 我理解是可以的,但是实际上不行
  3. char 指针分配空间的时候没分配够【我现在觉得不如直接怼二维数组啊
  4. *str_list[i] == *str_list[j] 只比较了首字母,还是用strcmp吧亲爱的

最后在这道easy题下瑟瑟发抖,我觉得如果是面试都够我凉好几次了QAQ感觉我字符串操作基础好水啊,strcmp strcpy strtok 都是现查的。想写一个字符串指针的数组还忘了初始分配TAT 现在感觉自己malloc还不如一开始直接弄个二维数组呢TAT

Notes

  1. 我写的时候没有考虑pattern都是小写的情况。我的假设里面,pattern是非"\n"的单个char类型。
  2. 判断匹配两两比较的时候,我设置了一点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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值