坏掉的键盘
1. 题目地址
https://www.acwing.com/video/1234/
2. 题目解析
这题有两种解决方案:
1. 打表
2. 双指针
3. 题解
双指针的解法:i代表主串指针,j代表子串指针。在遍历主串的过程中:如果二者相等,都往下走一次。如果二者不等,代表该字符已经缺失。此时应该输出,并且将主串指针往下移动即可。
这里需要注意:上述做法会出现:主串没有遍历完,而子串已经遍历完的情况。因此,我们要将子串的最后加上一个没有出现过的字符。(主要处理在最后的地方出现字符缺失的情况)。
由于这道题输出的是大写字符,因此我们可以将字符进行统一(大写)。而且,缺失的字符只需出现一次。因此,我们还需要一个数组,表示该字符是否已经输出过。
如果采用打表的话,我们可以使用一个数组,存储主串中出现过的字符(标记为1)。存储之后,再遍历子串,存储在子串中出现过的字符。(标记为2)。因此,该数组中:2代表没有缺失的字符,1代表缺失的字符。之后,再遍历主串,按照顺序将标记为1的字符输出即可。(需要注意:统一大写,是否已经输出过)
4. 代码
#include <iostream>
#include <cstdio>
using namespace std;
bool st[256];
int main(){
string str1,str2;
cin >> str1 >> str2;
str2 += '#';
for(int i = 0, j = 0;i < str1.size();i ++){
char x = toupper(str1[i]);
char y = toupper(str2[j]);
if(x == y){
j++;
}else{
if(!st[x]){
st[x] = true;
printf("%c",x);
}
}
}
return 0;
}
#include <iostream>
#include <cstdio>
using namespace std;
int table[256];
bool st[256];
char to_lower(int c){
if(c >= 'a' && c <= 'z'){
return c - 32;
}
return c;
}
int main(){
string str1,str2;
cin >> str1 >> str2;
for(int i = 0; i < str1.size(); i ++){
table[str1[i]] = 1;
}
for(int i = 0; i < str2.size(); i ++){
table[str2[i]] = 2;
}
for(int i = 0; i < str1.size(); i ++){
if(table[str1[i]] == 1 && !st[to_lower(str1[i])]){
st[to_lower(str1[i])] = true;
printf("%c",to_lower(str1[i]));
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现