题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。
分析:两种方法(java实现)
private static String deleteChars(String str1,String str2) {
char[] chars1 = getChars(str1);
char[] chars2 = getChars(str2);
//方法一:一个一个的找,然后删除。时间复杂度o(n*n)
/*char[] temp = new char[str1.length()] ;
int index = 0;
for(int i=0;i<str1.length();i++) {
boolean flag = false;
for(int j=0;j<str2.length();j++) {
if(chars1[i] == chars2[j]) {
flag = true;
break;
}
}
if(!flag) {
temp[index++] = chars1[i];
}
}
return new String(temp);*/
/**
* 方法二:当一个字符需要被删除的时候,把它所占的位置让它后面的字符来填补,也就相当于这个字符被删除了。在具体实现中,我们可以定义一个记录256个字符的数组,把所有的字符都设置成false
* ,然后把需要删除的对应字符位置设置为true,在扫描原始字符串的时候如果碰到的字符是为true的,那么我们就跳过去,也就相当于删除该字符。用这种方法,整个删除在O(n)时间内就可以完成。
*
*/
char[] temp = new char[str1.length()] ;
int k = 0;
boolean[] hashtable = new boolean[256];
for(int i=0;i<chars2.length;i++) {
if(chars2[i] >= 0)
hashtable[chars2[i]] = true;
else
hashtable[chars2[i] + 256] = true;
}
for(int i=0;i<str1.length();i++) {
int index = 0;
if(chars1[i] >= 0)
index = chars1[i];
else
index = chars1[i] + 256;
if(!hashtable[index])
temp[k++] = chars1[i];
}
return new String(temp);
}
private static char[] getChars(String str) {
char[] temp = new char[str.length()];
for(int i=0;i<str.length();i++) {
temp[i] = str.charAt(i);
}
return temp;
}