290.单词规律
原题:
给定一种规律 pattern
和一个字符串 s
,判断 s
是否遵循相同的规律。
这里的 遵循 指完全匹配,例如, pattern
里的每个字母和字符串 s
中的每个非空单词之间存在着双向连接的对应规律。
运行时间:
解题思路:
经典哈希表解法,采用映射的方法来判断,因为pattern字符数组中仅有小写字母,因此可以采用一个可以存放26个字符指针的哈希表来存放已建立映射关系的小写字母和单词,比方说a对应dog,但是当a与dog建立映射后若出现未建立映射的b,则会出现将dog再与b建立映射的情况,因此,我们在发现该小写字母例如:b,这类未建立映射的字母建立映射之前,先检查该单词是否已建立映射,方可解决此问题。
知识储备:
strtok函数,函数原型strtok(char *s1,char *s2),返回参数:字符数组指针(char*),在字符数组s1中寻找与字符数组s2相同的字符,将其修改为'\0',若再s1为空指针(即为NULL)则会返回上一次调用的字符数组中的下一个与字符数组s2相同的字符数组指针
例:char s1[]="abcbd",s2[]="b";
第一次调用:返回 s1="a'\0'c'\0'd";
第二次调用(s1=NULL):返回s1="c'\0'd"
strcmp函数,函数原型strcmp(char *s1,char *s2),返回参数:整型数字(int),比较字符数组s1和字符数组s2,若相等则返回0,不相等则返回非零数字
例:strcmp("abc","abc");
返回值:0
strcmp("acb","abc")
返回值:非零
memset函数,函数原型memset(指针,要设置的初始值,目标所占的字节大小),将指针所指的所有成员初始化为要设置的目标值;
例: memset(hash,0,sizeof(char*)*26);
效果:将hash指针所指的所有成员初始化为0,其所有成员所占的字节总大小为sizeof(char)*26
strlen函数,函数原型strlen(char *s),返回参数整型数字(int),计算一个字符数组的元素个数,不包括'\0'
例:char pattern[]="abba"
int len=strlen(pattern);
则len=4;
malloc函数,函数原型malloc(字节大小),返回参数指针(int),分配字节大小的内存,并返回一个指针指向所分配的内存块
例:int *nums=(int*)malloc(sizeof(int)*3)
效果:创建一个整型数组,其内存大小为3个int
都看到这里了,点个赞吧,可以的话在点个关注呗
源码:
bool wordPattern(char* pattern, char* s) {
int len=strlen(pattern);
char **hash=malloc(sizeof(char*)*26);
memset(hash,0,sizeof(char*)*26);
char *point=strtok(s," ");
int i=0;
while(i { if(hash[pattern[i]-97]==NULL)//未建立映射 { for(int k=0;k<26;k++)//查看该单词是否有对应的映射 { if(hash[k]==NULL) continue; if(strcmp(hash[k],point)==0)//发现该单词已经建立了映射 { return false; } } char *new=malloc(sizeof(char)*300); hash[pattern[i]-97]=strcpy(new,point);//建立映射 }else//若已建立映射 { if(strcmp(hash[pattern[i]-97],point)!=0) { return false; } } i++;point=strtok(NULL," "); } if(i==len&&point==NULL) { return true; } return false; } 个人创作,仅供参考,如有错漏,望指出更正