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;
}