C语言 | Leetcode C语言题解之第290题单词规律

题目:

题解:

typedef struct node_t
{
	char *key;
	char *value;
	struct node_t* pnext;
}NODE_T;

typedef struct hash_t
{
	NODE_T** hash_list;
	int size;
}HASH_T;

HASH_T *hash_init(int size)
{
	HASH_T *hash = (HASH_T *)malloc(sizeof(HASH_T));
	if(NULL == hash)
	{
		printf("open space error!");
		exit(0);
	}
	hash->hash_list = NULL;
	hash->size = size;

    hash->hash_list = (NODE_T **)calloc(size, sizeof(NODE_T *));
	if(NULL == hash->hash_list)
	{
		printf("open space error!");
		exit(0);
	}

    for(int i = 0; i < size; i++)
    {
        hash->hash_list[i] = (NODE_T *)calloc(size, sizeof(NODE_T));
        if(NULL == hash->hash_list[i])
        {
            printf("open space error!");
            exit(0);
        }
    }
    
	return hash;
}

int hash_pos(HASH_T *hash, char *key) // 返回当前键值所在链表
{
	return key[0] % hash->size;
}

NODE_T* hash_find(HASH_T *hash, char *key) // 返回值在链表的节点
{
	int pos = hash_pos(hash, key);
	NODE_T *now_node = hash->hash_list[pos]->pnext;

	while(now_node != NULL && strcmp(now_node->key, key))
	{
		now_node = now_node->pnext;
	}

	return now_node;
}

bool hash_put(HASH_T *hash, char *key, char *value) // 比对键值信息,未找到新建节点存储键值
{
	NODE_T *now_node = hash_find(hash, key);
    NODE_T *new_node = NULL;

	if(NULL == now_node)
	{
		new_node = (NODE_T*)malloc(sizeof(NODE_T));
		if(NULL == new_node)
		{
			printf("open space error!");
			exit(0);
		}
        new_node->key = (char*)malloc(sizeof(char) * (strlen(key) + 1));
		if(NULL == new_node->key)
		{
			printf("open space error!");
			exit(0);
		}
		strcpy(new_node->key, key);
        new_node->value = (char*)malloc(sizeof(char) * (strlen(value) + 1));
		if(NULL == new_node->value)
		{
			printf("open space error!");
			exit(0);
		}
		strcpy(new_node->value, value);
		new_node->pnext = hash->hash_list[hash_pos(hash, key)]->pnext;
		
		hash->hash_list[hash_pos(hash, key)]->pnext = new_node;
	}
	else
	{
		if(0 != strcmp(now_node->value, value))
		{
			return false;
		}
	}

	return true;
}

bool wordPattern(char* s, char* pattern) {
    HASH_T *pattern_hash = hash_init(26);
	HASH_T *s_hash = hash_init(26);
	char *str_pattern = NULL, *str_s = NULL; // 用于存放值
    int *pattern_count = NULL; // 存放每个单词所处下标
	int i = 0, count = 0, pattern_len = strlen(pattern), s_len = strlen(s); // 用于轮询数组,数组长度

	str_pattern = (char *)calloc(pattern_len + 1, sizeof(char)); // 分配值空间
    if(NULL == str_pattern)
    {
        printf("open space error!");
        exit(0);
    }
	str_s = (char *)calloc(2, sizeof(char));
    if(NULL == str_s)
    {
        printf("open space error!");
        exit(0);
    }
    pattern_count = (int *)calloc(pattern_len, sizeof(int));
    if(NULL == pattern_count)
    {
        printf("open space error!");
        exit(0);
    }

    pattern_count[count++] = 0; // 添加第一个下标
	for(i = 0; i < pattern_len; i++) // 替换空格,用于strcpy来拷贝单词
	{
		if(' ' == pattern[i])
		{
            pattern_count[count++] = i + 1; // 下一个单词起始位置
			pattern[i] = '\0';
		}
	}

    if(s_len != count) // 单词数不一致退出
    {
        return false;
    }

	for(i = 0; i < s_len; i++)
	{
		strcpy(str_pattern, &pattern[pattern_count[i]]); // 放入当前比对值
		str_s[0] = s[i];

		if(!hash_put(pattern_hash, str_pattern, str_s) || 
		   !hash_put(s_hash, str_s, str_pattern))
		{
			return false;
		}
	}

	return true;
}
  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
好的,我可以帮你解答这个问目描述: 给定一个 n x n 的网格,每个单元格都有一个正整数,代表从该点出发的初始能量。你的初始位置是左上角,即 (0,0) ,目标位置是右下角,即 (n-1,n-1)。你只能向右或向下走。在你走过某个单元格时,你需要用掉那个单元格中的能量(即:如果你在单元格(i,j)上,那么你需要用掉 grid[i][j] 的能量)。如果你没有足够的能量,那么你不能继续前进。你的目标是在保持最小初始能量的情况下,找到一条从左上角到右下角的路径,使得沿路径所需的能量最小化。 注意:当你经过某个单元格时,你需要跟踪你通过该单元格所剩余的能量(如果剩余能量为正数,则保留,否则将其归零)。 解思路: 本可以使用动态规划来解决。我们定义 dp[i][j] 表示从左上角到 (i, j) 位置所需要的最小初始能量。显然,dp[0][0] = grid[0][0]。 对于第一行和第一列,由于我们只能向右或向下走,因此我们可以得到: dp[0][j] = max(dp[0][j-1], grid[0][j]) dp[i][0] = max(dp[i-1][0], grid[i][0]) 对于其他位置,我们可以通过向右或向下移动到达该位置。因此,我们可以得到: dp[i][j] = min(max(dp[i-1][j], dp[i][j-1]) - grid[i][j], 0) + grid[i][j] 由于最终状态是 dp[n-1][n-1],因此我们可以得到最终的答案为 max(dp[n-1][n-1], 1)。 代码实现: ```c int calculateMinimumHP(int** dungeon, int dungeonSize, int* dungeonColSize){ int m = dungeonSize, n = dungeonColSize[0]; int dp[m][n]; dp[0][0] = dungeon[0][0]; for (int j = 1; j < n; j++) { dp[0][j] = max(dp[0][j-1], dungeon[0][j]); } for (int i = 1; i < m; i++) { dp[i][0] = max(dp[i-1][0], dungeon[i][0]); } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { dp[i][j] = min(max(dp[i-1][j], dp[i][j-1]) - dungeon[i][j], 0) + dungeon[i][j]; } } return max(dp[m-1][n-1], 1); } ``` 这就是使用完整的c语言完成leetcode第1514的代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值