LeetCode290. 单词模式

https://leetcode-cn.com/problems/word-pattern/submissions/

给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。
这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。

示例1:
输入: pattern = “abba”, str = “dog cat cat dog”
输出: true

示例 2:
输入:pattern = “abba”, str = “dog cat cat fish”
输出: false

示例 3:
输入: pattern = “aaaa”, str = “dog cat cat dog”
输出: false

示例 4:
输入: pattern = “abba”, str = “dog dog dog dog”
输出: false
说明:
你可以假设 pattern 只包含小写字母, str 包含了由单个空格分隔的小写字母。

思路:可以利用字母下标的数组保存对应字符串,进行匹配(或者哈希表),详细实现见代码注释

// "abba"  "ha ha ha ha" 针对这种情况需要遍历数组
bool compare_arr(char *tmp , char **src){
    int i = 0;
    for(; i < 26; i++){
        if(0 != strlen(src[i])){
            if(0 == strcmp(tmp , src[i])){
                return false;
            }
        }
    }
    return true;
}

bool wordPattern(char* pattern, char* str) {
    // 入参检查
    if(NULL == pattern || NULL == str){
        return false;
    }
    
    int i = 0;
    int length = strlen(pattern);
    int strleng = strlen(str);
    
    // 初始化help数组(类似哈希表)
    char **help = (char **)calloc(26, sizeof(char *));
    for(i = 0; i < 26; i++){
        help[i] = (char *)calloc(1, 100 * sizeof(char));
    }
    
    char *start = str;
    char *end = str;
    // 开始遍历str 
    for(i = 0; i < length; i++){
        if(i == 0){  // 第一个字母前没有空隔
            start = end; 
        }else{
            if(*end == '\0'){  // pattern没有遍历完成前,str遍历到了最后,则不匹配
                return false;
            }
            start = ++end;
        }

        if(*end != '\0' && pattern[i] != '\0'){
            while(*end != ' ' && *end != '\0'){   //start  end 截取匹配的字符串
                end++;
            }
            // 截取的字符串赋值给tmp
            int cpylength = end - start;
            char tmp[100];
            strncpy(tmp, start, cpylength);
            tmp[cpylength] = '\0';
            // 若help数组中对应的字母下标保存的字符串已经存在则比较是否相等,相等则继续,否则返回false
            if(0 != strlen(help[pattern[i] - 'a'])){
                if(0 != strcmp(tmp, help[pattern[i] - 'a'])){
                    for(i = 0; i < 26; i++){  // 释放calloc空间
                        free(help[i]);
                    }
                    free(help);
                    return false;
                }
            }else{
                if(0 == compare_arr(tmp, help)){ //"abba"  "ha ha ha ha" 针对这种情况需要遍历数组
                    return false;
                }
                // help数组中对应的字母下标字符串为空,则保存
                strncpy(help[pattern[i] - 'a'],start, cpylength);
                help[pattern[i] - 'a'][cpylength] = '\0';
            }
        }
    }
    // "abba" "ha dd dd ha bb" 这种不对等的情况需要返回false
    if(*end != '\0'){ 
        return false;
    }
    // 释放calloc空间
    for(i = 0; i < 26; i++){
      free(help[i]);
    }
    free(help);
    
    return true;
}

猜你喜欢

转载自blog.csdn.net/qq_34595352/article/details/87935149
今日推荐