LeetCode: Anagrams

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

Note: All inputs will be in lower-case.

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace::std;
class Solution {
public:
	long RSHash(string str)
	{
		int a = 378551;
		int b = 63689;
		long hash = 0;
		for(int i = 0; i < str.size(); i++)
		{
			hash = hash * a + str[i];
			a = a * b;
		}
		return hash;
	}
    vector<string> anagrams(vector<string> &strs) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
		vector<string> copy(strs);
		vector<string> result;
		map<long, vector<int> > mymap;
		long key = 0;
		for(size_t i = 0; i < strs.size(); i++)
		{
			sort(strs[i].begin(), strs[i].end());
		}
		
		for(size_t i = 0; i < strs.size(); i++)
		{
			//mymap[strs[i]].push_back(i);
			mymap[RSHash(strs[i])].push_back(i);
		}
		
		
		for(size_t i = 0; i < strs.size(); i++)
		{
			if(mymap[RSHash(strs[i])].size() > 1)
			while(mymap[RSHash(strs[i])].size() > 0)
			{
				result.push_back(copy[mymap[RSHash(strs[i])].back()]);
				mymap[RSHash(strs[i])].pop_back();
			}

		}
		
		return result;
        
    }
};
int main()
{
	vector<string> aa;
	
	aa.push_back("tea");
	aa.push_back("ate");
	aa.push_back("eta");

	
	Solution ss;
	ss.anagrams(aa);
//	int a;
//	cout<<a<<endl;
//	ss.print(ss.threeSum(aa));
}

知识点:

找出一个vector<string>中所有重复元素的位置, 先建立一个map<long,vector<int> >, 再将string通过hash 转换为 long

之后

for(int i = 0; i < size; i++)

 map[hashvalue].push_back(i);

另外马哥说要复习各种时间复杂度的hash算法


Round 2:

class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        map<string, int> map;
        vector<string> result;
        for(int i = 0; i < strs.size(); i++)
        {
            string temp = strs[i];
            std::sort(temp.begin(), temp.end());
            if(map[temp] == 0)
                map[temp] = i+1;
            else if(map[temp] == -1)
            {
                result.push_back(strs[i]);
            }
            else
            {
                result.push_back(strs[map[temp]-1]);
                result.push_back(strs[i]);
                map[temp] = -1;
            }
        }
        return result;
    }
};


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值