删除字符串中模式串

这次贴上的是盛大公司的笔试题

题目:删除模式串中出现的字符,如“welcome to asted”,模式串为“aeiou”那么得到的字符串为“wlcm t std",要求性能最优。

1、假设这道题目仅仅是对小写字母字符而言,那么本题可以这样做,创建26个桶,每个桶中存放一个标记,标记这个桶中有没有模式串中的字符,这样查找就相当方便了,而这样空间复杂度又不是太大。

package com.interview;

public class PatternDeleteSub {
	private static boolean[] bucket = new boolean[26];

	public PatternDeleteSub() {
		for (int i = 0; i < bucket.length; ++i)
			bucket[i] = false;
	}

	private String patternDeleteSub(String source, String pattern) {
		int i = 0;
		for (i = 0; i < pattern.length(); ++i)
			bucket[pattern.charAt(i) - 'a'] = true;
		StringBuilder result = new StringBuilder();
		i = 0;

		while (i < source.length()) {
			char ch = source.charAt(i);
			i++;
			if (ch <= 'z' && ch >= 'a') {
				if (bucket[ch - 'a'])
					continue;
				else
					result.append(ch);
			} else
				result.append(ch);

		}

		return result.toString();
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PatternDeleteSub pds = new PatternDeleteSub();
		System.out.println(pds.patternDeleteSub("welcome to asted", "aeiou"));
	}
}


2、其实本题的关键就在于如何快速地查找到模式串中字符,查找的一个比较高效的算法就是hash表,虽然hash耗费了一定的空间,但是查找速度非常快,为O(1),所以我们可以把模式字符串中存放的字符放在hash表中,那么就可以在查找中快速地找到要闪淳的字符了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值