1160. Find Words That Can Be Formed by Characters*

1160. Find Words That Can Be Formed by Characters*

https://leetcode.com/problems/find-words-that-can-be-formed-by-characters/

题目描述

You are given an array of strings words and a string chars.

A string is good if it can be formed by characters from chars (each character can only be used once).

Return the sum of lengths of all good strings in words.

Example 1:

Input: words = ["cat","bt","hat","tree"], chars = "atach"
Output: 6
Explanation: 
The strings that can be formed are "cat" and "hat" so the answer is 3 + 3 = 6.

Example 2:

Input: words = ["hello","world","leetcode"], chars = "welldonehoneyr"
Output: 10
Explanation: 
The strings that can be formed are "hello" and "world" so the answer is 5 + 5 = 10.

Note:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length, chars.length <= 100
  • All strings contain lowercase English letters only.

C++ 实现 1

统计 chars 中每个字符的个数, 判断 words 中的每个 string 是否可以使用 chars 中的字符生成.

class Solution {
private:
	// 注意这里的 nums 不是引用, 会发生数据的拷贝, 从而不影响 records 数组
    bool isGood(vector<int> nums, const string &str) {
        for (auto &c : str) {
            if (nums[c - 'a'] == 0) return false;
            else nums[c - 'a'] --;
        }
        return true;
    }
public:
    int countCharacters(vector<string>& words, string chars) {
        vector<int> records(26, 0);
        int res = 0;
        for (auto &c : chars) records[c - 'a'] ++;
        for (auto &s : words)
            if (isGood(records, s))
                res += s.size();
        return res;
    }
};
<think>嗯,用户让我解释这个函数的作用和结构。首先,我需要看一下这个函数的定义和注释。函数名是emberAfPluginXncpIncomingCustomFrameCallback,看起来是EmberZNet协议栈中的一个回调函数。 注释里提到,当NCP(网络协处理器)从主机收到自定义的EZSP消息时,会调用这个函数。EZSP是EmberZNet串行协议,用于主机和NCP之间的通信。那这个回调函数的作用应该是处理这些自定义消息,并生成回复。 参数方面,messageLength和messagePayload是接收到的消息长度和内容。replyPayloadLength和replyPayload是用于设置回复的长度和数据。返回值是EmberStatus,表示处理结果,并且这个状态码会是EZSP响应的第一个字节。 用户可能需要了解这个函数在系统中的角色,比如在开发自定义通信功能时如何实现这个回调。需要注意,当前的实现直接返回EMBER_LIBRARY_NOT_PRESENT,说明默认情况下没有处理逻辑,需要用户自己添加。 需要解释每个参数的具体用途,特别是回复部分需要如何设置。还要提到返回值的重要性,因为它会影响主机收到的响应状态。此外,可能的应用场景和示例代码可能会有帮助,但用户没明确要求,所以可能不需要深入。 可能用户是嵌入式开发者,使用EmberZNet开发无线网络应用,需要处理自定义消息。需要确保他们理解如何修改这个回调函数,正确设置回复内容和长度,并处理错误情况。另外,要提醒他们检查库是否存在,避免返回默认的错误状态。</think>这是一个用于处理自定义EZSP消息的框架回调函数,主要用于EmberZNet协议栈开发。以下是对该函数的详细说明: $$EmberStatus\ emberAfPluginXncpIncomingCustomFrameCallback(\quad)$$ **函数作用**: 当网络协处理器(NCP)从主机(HOST)收到自定义EZSP消息时触发,用于实现自定义通信协议。开发者需在此处理消息并构造响应。 **参数解析**: 1. `uint8_t messageLength` - 输入参数 - 表示接收消息的字节长度 - 范围:0-255字节 2. `uint8_t *messagePayload` - 输入参数(指针) - 指向接收消息内容的缓冲区 - 示例访问方式:`messagePayload[0]` 读取第一个字节 3. `uint8_t *replyPayloadLength` - 输出参数(指针) - 必须由开发者设置响应数据的长度 - 正确用法:`*replyPayloadLength = 5;` 表示5字节响应 4. `uint8_t *replyPayload` - 输出参数(指针) - 用于写入响应数据的缓冲区 - 正确用法:`replyPayload[0] = 0x01;` 写入第一个响应字节 **返回值**: - 类型:`EmberStatus` - 作用:指示消息处理状态,将作为EZSP响应的首字节 - 常见返回值示例: - `EMBER_SUCCESS` (0x00):成功处理 - `EMBER_ERR_FATAL` (0x11):严重错误 - 当前默认返回`EMBER_LIBRARY_NOT_PRESENT` (0x14) 表示未实现 **开发注意要点**: 1. **参数有效性检查**: ```c if (messagePayload == NULL || replyPayload == NULL) { return EMBER_BAD_ARGUMENT; } ``` 2. **典型实现流程**: $$ \begin{aligned} &1.\ 解析messagePayload \\ &2.\ 执行业务逻辑 \\ &3.\ 构造replyPayload \\ &4.\ 设置replyPayloadLength \\ &5.\ 返回状态码 \end{aligned} $$ 3. **内存安全**: - 必须确保不超出缓冲区边界 - 接收/发送缓冲区最大长度均为255字节 4. **性能要求**: - 应保持函数执行时间短(建议<10ms) - 避免阻塞操作 该函数常用于实现以下场景: - 自定义设备配置协议 - OTA固件升级控制 - 私有传感器数据交换 - 网络诊断扩展功能 示例实现框架: ```c EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(...) { if (messageLength < 1) { return EMBER_BAD_ARGUMENT; } // 示例:原样返回接收数据 *replyPayloadLength = messageLength; memcpy(replyPayload, messagePayload, messageLength); return EMBER_SUCCESS; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值