长按键入

本文介绍了一种判断长按输入是否能匹配特定名称的算法。通过遍历目标名称,对比键盘输入,考虑到连续字符的特殊情况,实现高效准确的匹配判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。

示例 1:
输入:name = “saeed”, typed = “ssaaedd”
输出:false

示例 2:
输入:name = “leelee”, typed = “lleeelee”
输出:true

示例 3:
输入:name = “laiden”, typed = “laiden”
输出:true

class Solution {
public:
	bool isLongPressedName(string name, string typed) {
		int i, pos = 0;
		for (i = 0; i < name.size(); i++){
			if (name[i] != typed[pos]){
				return false;
			}
			while (name[i] == typed[pos]){
				if (name[i] == name[i + 1]){
					pos++;
					break;
				}
				pos++;
			}
		}
		return true;
	}
};

题解:遍历字符串name,让type字符串从前向后依次移动。当name和type字符相等时,type向后走直到两字符不相等时,但是存在特殊情况当name字符串相邻两个字符相等时,就只让type向后走一次即可。

### 51单片机按键的单击、双击和按实现方法 对于51单片机而言,在处理按键事件时,通过定时器来检测按键状态的变化可以有效地区分单击、双击以及按操作。具体来说: #### 定义时间阈值 为了区分不同的点击模式,定义两个主要的时间阈值:一个是用于判断短按时限(通常设为0.5秒),另一个则是用来确认按动作的发生时限(一般设定大于等于1秒钟)。当按键被按下后的持续时间内未达到按标准但已释放,则会进一步检查这段时间内的点击次数以决定是单次还是两次快速点击。 #### 检测逻辑流程 一旦检测到有键入信号发生,即启动一个计时过程并开始监测该按钮的状态变化情况。如果在这个预设时间段内(比如小于0.5秒)再次接收到相同的输信号,则视为一次新的点击尝试;反之则认为是一般的短暂触碰或是误触发而忽略不计。特别地,若经过了一定周期之后仍然保持闭合状态,则会被认定为时间持有行为——也就是所谓的“按”。 #### C语言代码示例 下面给出一段简单的C程序片段作为例子说明如何利用上述思路编写适用于8051架构微控制器上的软件部分[^1]。 ```c #include <reg52.h> #define KEY_PORT P3 // 假设按键连接到了P3口上 unsigned char key_state = 0; bit is_long_press = 0; void delay(unsigned int ms){ unsigned int i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); } // 初始化函数 void init(){ TMOD = 0x01; // 设置T0工作于方式1(16位自动重装载) TH0=(65536-500)/256; // 设定初值使定时中断每过约500us产生一次 TL0=(65536-500)%256; EA=1; // 开启全局中断允许标志EA ET0=1; // 启动定时/计数器0溢出中断ET0 TR0=1; // 启动定时器0运行TR0 } // 中断服务子程序 void timer0() interrupt 1 { static unsigned short count = 0; TH0=(65536-500)/256; TL0=(65536-500)%256; if(KEY_PORT == 0){ // 如果按键处于低电平表示已被按下 ++count; if(count >= 200 && !is_long_press){ // 超过1000毫秒判定为按 is_long_press = 1; while(!KEY_PORT); // 等待按键弹起 count = 0; } } else { // 当按键抬起时进行下一步判断 if(is_long_press){ // 执行按对应的操作... is_long_press = 0; } else if (count > 0 && count < 200) { // 小于1000毫秒且大于零的情况考虑是否构成双击条件 switch(key_state){ case 0: // 这里执行首次点击响应... key_state++; break; case 1: if((TH0*256+TL0)*2<750){ // 若第二次点击间隔不超过750毫秒则视作双击 // 处理双击事件... key_state = 0; } else{ // 单独的一次点击... key_state = 0; } break; default : ; } count = 0; } } } ``` 这段代码展示了基本框架下的按键扫描机制及其相应的延时处理策略。实际应用中可能还需要根据具体的硬件配置调整参数设置,并加去抖动措施确保读取准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值