牛客题——删除公共字符(哈希表的方法)

该博客介绍了一种利用哈希表解决字符串处理问题的方法。具体是通过建立一个哈希表存储第二个字符串的字符及其出现次数,然后遍历第一个字符串,移除在哈希表中存在的字符,从而实现删除指定字符串中的字符。代码示例展示了如何实现这一过程。

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

题目描述

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

输入描述

每个测试输入包含2个字符串

输出描述

输出删除后的字符串

示例

输入:

They are students.
aeiou

输出

Thy r stdnts.

思想方法

用哈希表对问题进行求解

  1. 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串;
  2. 将该数组与第一个字符进行比较,将第二个字符串中不存在的字符放到新的一个字符串中,最后返回新的字符串。

代码解析:

		Scanner sc = new Scanner(System.in);
		//用的是nextline(),如果用next()的话取到空格就停止了
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        //构建一个键为字符类型,值为Integer类型的HashMap
        HashMap<Character,Integer> map = new HashMap<>();

先对第二个字符串进行遍历,如果所对应的HahMap值为空(Integer类型==null),就将其值设为1,代表这个值出现一次,如果不为空就在原来的值的基础上+1,则该值出现多次。

		for(int i =0;i<str2.length();i++){
            if(map.get(str2.charAt(i))==null){
                map.put(str2.charAt(i),1);
            }else{
                map.put(str2.charAt(i),map.get(str2.charAt(i))+1);
            }
        }

再对第一个字符串进行遍历找到与第二个字符串中不符合的字符未出现的字符。
(即代表该字符在HashMap中所对应的值为0)

		String s = "";
        for(int i =0;i<str1.length();i++){
            if(map.get(str1.charAt(i))==null){
                s += str1.charAt(i);
            }
        }
        System.out.println(s);

最终输出新的字符串s。

完整代码:

import java.util.HashMap;
import java.util.Scanner;

public class deleteCharInString {
    //输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
    // 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str1 = sc.nextLine();
        String str2 = sc.nextLine();
        HashMap<Character,Integer> map = new HashMap<>();

        for(int i =0;i<str2.length();i++){
            if(map.get(str2.charAt(i))==null){
                map.put(str2.charAt(i),1);
            }else{
                map.put(str2.charAt(i),map.get(str2.charAt(i))+1);
            }
        }

        String s = "";
        for(int i =0;i<str1.length();i++){
            if(map.get(str1.charAt(i))==null){
                s += str1.charAt(i);
            }
        }
        System.out.println(s);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值