题目
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
示例1
输入:
They are students.
aeiou
输出:
Thy r stdnts.
思路
本题如果使用传统的暴力查找方式:判断第一个串的字符是否在第二个串中,若在,再挪动字符删除这个字符,时间复杂度为O(N^2),效率太低,很难让人满意。
优化:
- 将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串中。
- 判断第一个字符串中的字符若在第二个字符串中,不要使用删除这个字符的方式,这样效率太低,因为每次删除都伴随数据挪动。这里可以考虑使用:将第一个字符串中不在第二个字符串中的字符添加到一个新的字符串中,最后返回新的字符串即可。
代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//输入第一个字符串
String str1 = scan.nextLine();//They are students.
//输入第二个字符串
String str2 = scan.nextLine();//aeiou
//创建哈希表,存放第二个字符串的所有字符
//哈希表的key为字符,value为这个字符出现的次数
HashMap<Character, Integer> map = new HashMap<>();
//遍历第二个字符串,将所有字符存放到哈希表中
for (int i = 0; i < str2.length(); i++) {
//如果哈希表中得不到第二个字符串的第i个字符,说明还没存进去,那么需要将这个字符添加到哈希表中
if (map.get(str2.charAt(i)) == null) {
map.put(str2.charAt(i), 1);
} else {
//说明哈希表中已经存放过了第i个字符,那么更新value值加一
map.put(str2.charAt(i), map.get(str2.charAt(i)) + 1);
}
}
//定义返回结果:即为第一个字符串中删除第二个字符串中的所有字符后的字符串
String ret = "";
//遍历第一个字符串,判断哈希表中是否存在第一个字符串中的所有字符,即判断第二个字符串中是否存在第一个字符串中的所有字符
for (int i = 0; i < str1.length(); i++) {
//若第二个字符串中不存在第一个字符串中的字符,将其加到结果集中
//没有加入到结果集中的字符,就是第一个字符串中含有的第二个字符串中的所有字符
if (map.get(str1.charAt(i)) == null) {
ret += str1.charAt(i);
}
}
System.out.println(ret);
}
}