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;
    }
};


阅读更多
文章标签: string 算法
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

LeetCode: Anagrams

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭