坏掉的键盘

坏掉的键盘

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;
}
posted @   夏目^_^  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示