算法强化每日一题--删除公共字符

简介: 算法强化每日一题--删除公共字符

先来看看题目


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


思路:


这个题目使用Set来做,set具有去重的效果


遍历第二个没有重复元素的数组放到set中


再遍历第一个长的数组,和set的元素比较,如果相同就跳过,不相同,就放到拼接字符串中


265b60b4713e4b8fbaadd8e530811946.png

然后搞一个StringBuffer对象,用于拼接符合条件的字符串  

思路有了,我们来看一看代码


public class TestDemo {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s1=in.nextLine();
        String s2=in.nextLine();
        Set<Character> set=new HashSet<>();
        StringBuffer stringBuffer=new StringBuffer();//拼接字符串
        for(int i=0;i<s2.length();i++) {
            char ch = s2.charAt(i);
            set.add(ch);
        }
            for(int j=0;j<s1.length();j++){
                char ch1=s1.charAt(j);
                if(!set.contains(ch1)){
                    stringBuffer.append(ch1);
                }
            }
        System.out.println(stringBuffer);
    }
}


2.使用哈希映射思想

1.要创建一个大小为256的int类型的数组,每个值为0

2.然后遍历第二个数组,记录一下,出现了就++

3.遍历第一个数组,和map数组的元素对比,有的话跳过,没有就拼接到字符串上

画个图来理解一下


700b26dbed6340799049631fdbe5597d.png

hash[str[i]]++


本来hash数组的每一个值为0,现在遍历一下第二个数组,当i=0时,str[i]=98,也就意味着在hash数组中找下标为98的下标,进行+1操作,如果本来就有,那就要在原来的结果上+1,没有的话就直接添加


然后遍历第一个数组,看看map数组有没有str1的值,没有就拼接到字符串上,最后进行打印


思路有了,我们来写代码


import java.util.HashMap;
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String s1=scanner.nextLine();
        String s2=scanner.nextLine();
        HashMap<Character,Integer> hashMap=new HashMap<>();
        //遍历第二个数组
        for(int i=0;i<s2.length();i++){
            if(hashMap.get(s2.charAt(i))==null){
                hashMap.put(s2.charAt(i),1);
            }else{
                hashMap.put(s2.charAt(i),hashMap.get(s2.charAt(i))+1);
            }
    }
        //遍历第一个数组
        String ret="";
        for(int i=0;i<s1.length();i++){
            if(hashMap.get(s1.charAt(i))==null){
                ret+=s1.charAt(i);
            }
        }
        System.out.println(ret);
    }
}


这两种不同的方法,第一种是采用set集合的去重,第二种是采用哈希映射

但是相同的地方在于遍历


以后再遇到这种删除公共字符类的题目,就向哈希数组或者set去重这方面进行靠拢!!!

今天的讲解就到此结束,我们下期再见!!!


892c806d0d6841c48c45f302a095b91b.gif

下期再见,各位老铁!!!

相关文章
|
1月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
48 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-439 算法训练 简单字符变换
54 1
|
6月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
63 0
|
3月前
|
算法
【算法】位运算算法——判断字符是否唯一
【算法】位运算算法——判断字符是否唯一
|
3月前
|
算法
【算法】滑动窗口——无重复字符的最长子串
【算法】滑动窗口——无重复字符的最长子串
|
6月前
|
算法 测试技术 编译器
【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
题目描述 题目 在字符矩阵中查找给定字符串的所有匹配项 给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。
102 1
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(二)
FPGA强化(10):基于Sobel算法的边缘检测(二)
60 0
|
4月前
|
算法 异构计算
FPGA强化(10):基于Sobel算法的边缘检测(一)
FPGA强化(10):基于Sobel算法的边缘检测
35 0
|
6月前
|
算法 C++
【优选算法】——滑动窗口——3. 无重复字符的最长子串
【优选算法】——滑动窗口——3. 无重复字符的最长子串
|
5月前
|
算法
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)
65 0
下一篇
无影云桌面