每日力扣算法题(简单篇)

290.单词规律

原题:

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。

运行时间:

每日力扣算法题(简单篇)_第1张图片

解题思路:

经典哈希表解法,采用映射的方法来判断,因为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;

}

个人创作,仅供参考,如有错漏,望指出更正

你可能感兴趣的:(力扣简单篇,leetcode,算法,职场和发展)