关闭

LeetCode: Anagrams

标签: string算法
2332人阅读 评论(0) 收藏 举报
分类:

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:95051次
    • 积分:2989
    • 等级:
    • 排名:第11751名
    • 原创:208篇
    • 转载:1篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论