【leetCode】500. 键盘行

这篇文章介绍了如何使用编程解决一个实际问题,即根据美式键盘布局找出只包含同一行字母的单词。通过strchr函数检查每个单词中字符是否来自qwertyuiop、asdfghjkl或zxcvbnm这三个键盘行,实现单词筛选。
摘要由CSDN通过智能技术生成

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

American keyboard

 

第一行由字符 "qwertyuiop" 组成。
第二行由字符 "asdfghjkl" 组成。
第三行由字符 "zxcvbnm" 组成。

示例 1:

输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
示例 2:

输入:words = ["omk"]
输出:[]
示例 3:

输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
 

提示:

1 <= words.length <= 20
1 <= words[i].length <= 100
words[i] 由英文字母(小写和大写字母)组成

思路:

先将这三行键盘字母保存在三个字符数组中,然后记录数组中的每一个字符串中的每一个字符出现的次数(这里采用函数strchr:查找某字符在字符串中首次出现的位置,

函数原型:char * strchr (const char *str, int c)

【参数】str 为要查找的字符串,c 为要查找的字符。)

所以,如果出现的次数和字符串本身的长度相等,就说明所有字符都在同一行出现了

bool findChar(char* words, int wordsSize) {
	char line1[] = "qwertyuiopQWERTYUIOP";
	char line2[] = "asdfghjklASDFGHJKL";
	char line3[] = "zxcvbnmZXCVBNM";
	int i = 0, j = 0, k = 0;
	
	while (strchr(line1, words[i]) != NULL && i < wordsSize)
	{
		i++;
	}
	while (strchr(line2, words[j]) != NULL && j < wordsSize)
	{
		j++;
	}
	while (strchr(line3, words[k]) != NULL && k < wordsSize)
	{
		k++;
	}
	// 判断count是否等于wordsSize
	if ((i == wordsSize) || (j == wordsSize) || (k == wordsSize))
	{
		return true;
	}
	else
	{
		return false;
	}
}

char** findWords(char** words, int wordsSize, int* returnSize) {
	
	char** res = (char**)malloc(sizeof(char) * (20 * wordsSize));
	memset(res, "\0", sizeof(char) * (20 * wordsSize));
	*returnSize = 0;
	for (int i = 0; i < wordsSize; i++)
	{
		int n = strlen(words[i]);
		if (findChar(words[i], n))
		{
			res[(*returnSize)++] = words[i];
		}
	}
	return res;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值