LeetCode Anagrams

Anagrams

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

本题最巧妙的思想:

因为所谓的anagram是字符位置不一样,字符串是一样的,那么就把该字符排序之后作为map的关键字。

排序之后作为关键字-绝!

vector<string> anagrams(vector<string> &strs) {
	vector<string> vst;
	if (strs.size() < 2) return vst;

	map<string, vector<string> > msvs;

	for (int i = 0; i < strs.size(); i++)
	{
		string s = strs[i];
		sort(s.begin(), s.end());//精华,最巧妙的地方:排序后作为map的关键字。黄绢幼妇外孙!
		msvs[s].push_back(strs[i]);
	}

	for (auto it:msvs)
	{
		if (it.second.size() > 1)
			vst.insert(vst.end(),it.second.begin(), it.second.end());
	}
	return vst;
}


下面也是hash思想写的程序,程序应该正确了,可惜超时。还是需要像上面那样进一步优化。

vector<string> anagrams(vector<string> &strs) {
		vector<string> vst;
		if (strs.size() < 2) return vst;
		vector<int> v1, v2;
		int n = strs.size();
		for (int i = 0; i < n; i++)
		{
			bool flag = false;
			vst.push_back(strs[i]);
			v1.clear(); v1.resize(26,0);
			for (int k = 0; k < strs[i].length(); k++)
			{
				v1[strs[i][k]-'a']++;
			}
			for (int j = i+1; j < n; j++)
			{
				if (strs[i] == strs[j]) continue;
				v2.clear(); v2.resize(26,0);
				for (int k = 0; k < strs[j].length(); k++)
				{
					v2[strs[j][k]-'a']++;
				}
				if (v1 == v2)
				{
					vst.push_back(strs[j]);
					strs.erase(strs.begin()+j);
					n--;
					flag = true;
				}
			}
			if (!flag) vst.pop_back();
		}
		return vst;
	}


//2014-1-27
	vector<string> anagrams(vector<string> &strs) 
	{
		unordered_map<string, vector<string> > map_str_vec;

		for (auto x:strs)
		{
			string s = x;
			sort(s.begin(), s.end());
			map_str_vec[s].push_back(x);
		}
		vector<string> rs;
		for (auto x:map_str_vec)
		{
			if (x.second.size() > 1)
			{
				for (auto y:x.second) rs.push_back(y);
			}
		}
		return rs;
	}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值