码迷,mamicode.com
首页 > 其他好文 > 详细

【leetcode】Substring with Concatenation of All Words

时间:2014-06-01 12:54:53      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:algorithm   leetcode   面试题   substring   算法   

题目:

给定一个字符串S,一个字符串数组L,找出S中所有这样的子串起点,该子串包含L中的所有元素。

说明:

1)L中存在重复的元素
2)子串不允许间断,即子串从开始到找全L中的所有元素之前,子串中不允许包含L以外的东西,而且,即使当前处理的子串是L中含有的,但是前面已经找够了,这个多余的也是不合法的,若此时还有L中的其他元素没找到,从这个起点开始也是不成功的。
3)L在S中出现的顺序不同考虑,任意顺序,只要全部存在就可以。

分析:

1)先对L中的所有元素做个统计,定义一个hash map<string, int> 型 变量total,统计每个词出现的次数,另外定义一个同类型的has_find,用来记录到目前为止,已经找到的L中的元素情况,当全部找全的时候就找到了一个合法的起始点。然后将has_find清空,继续找。
2)整体的框架与传统的字符串匹配一致,不同的是这里不要求顺序,所以似乎在S中不能加速移动。

实现:

vector<int> findSubstring(string S, const vector<string> &L) {

	vector<int> re;
	if(S.size() == 0 || L.size() == 0)
		return re;

	unordered_map<string, int> total;
	unordered_map<string, int> has;
	int wordNum = L.size();
	int wordLen = L[0].size();
	int searchEnd = S.size() - wordLen * wordNum;

	for (int i = 0; i < wordNum; ++i)
	{
		total[L[i]]++;
	}
	for (int i = 0; i <= searchEnd; ++i)
	{
		int j = i;
		has.clear();
		int iword = 0;
		for (; iword < wordNum; ++iword)
		{
			string sub = S.substr(j, wordLen);
			//not in L
			if(total[sub] == 0)
				break;
			//in L, but redundancy
			if(++has[sub] > total[sub])
				break;
			j += wordLen;
		}
		if(iword == wordNum)
		{
			re.push_back(i);
		}
	}
	return re;
}

后记:

程序跑了1400多毫秒,这几乎是目前为止时间最久的一个题了,看来有更好的算法?

【leetcode】Substring with Concatenation of All Words,布布扣,bubuko.com

【leetcode】Substring with Concatenation of All Words

标签:algorithm   leetcode   面试题   substring   算法   

原文地址:http://blog.csdn.net/shiquxinkong/article/details/27806183

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!