【剑指offer】之删除在另一个字符串中出现的字符

题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”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;
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值