坏掉的键盘
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;
}
标签:字符,坏掉,主串,int,str2,str1,st,键盘
From: https://www.cnblogs.com/gao79135/p/17706310.html