Anagrams

https://oj.leetcode.com/problems/anagrams/


anagrams:如果两个字符串具有完全相同的字符,只是字符的排序不同,则称为anagrams——回文构词法,因此anagrams至少指两个字符串。


1、题目要求:给定一组字符串,返回所有回文构词法组成的单词。

注:所有字符都是小写的。

例:假设输入[ "tea", "ate", "eat", "are", "wander", "warned", "and" ]

则返回["tea", "ate", "eat", "wander", "warned" ] —— 有两组回文;


2、解题思路:

1)依次访问数组中的每个单词,将单词排序后作为键值key保存在hash table里,然后将单词排序,在hash table里面查找,如果找到了,则说明此单词是回文;如果没有找到,则将其排序后的字符作为键值key保存在hash table里,以便后面的单词匹配关键字key(说明有多组回文);


class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        vector<string> result;
        string key;
        map<string, int> string_map;
        map<string, int>::iterator it;
        for(int i=0; i!=strs.size(); i++)
        {
            key= strs[i];
            sort(key.begin(), key.end());                       //将每个单词排序后,再将其作为键值key
            it= string_map.find(key);
            if(it!=string_map.end())                            //如果找到了,则将其添加到result后面;
            {
                if(string_map[key]>=0)
                {
                    result.push_back(strs[string_map[key]]);    //将第一个重复的单词添加到result后面;
                    string_map[key]= -1;
                }
                result.push_back(strs[i]);                      //依次添加重复键key对应的单词strs[i];
            }
            else
            {
                string_map[key]= i;                             //如果没有找到,则将其加入hash table中
            }
        }
        return result;
    }
};


2)首先依次访问strs里面的所有单词,将相同key对应的单词添加到hash tale里,然后判断关键码key后面的元素个数是否大于1,


class Solution {
public:
    vector<string> anagrams(vector<string> &strs) {
        vector<string> result;
	    map<string, vector<string> > m;
	    int n= strs.size();
	    string key;
        for (int i= 0; i< n; i++)
	    {
		    key= strs[i];
		    sort(key.begin(), key.end());
		    //如果key在m中不存在,则将创建一个以key为关键码的记录,并将strs[i]加到此记录后面
		    //如果key在m中已存在,则将strs[i]加到以key为关键码的记录后面
		    m[key].push_back(strs[i]);
	    }
	    for (map<string, vector<string> >::iterator iter= m.begin(); iter!= m.end(); iter++)
	    {
	        //如果某个关键码后面的元素个数>1,则说明此关键码有对应的回文,将此关键码后面的元素都添加到result里
		    if ((iter->second).size() > 1)
		    {
			    for (int i= 0; i< (iter->second).size(); i++)
				    result.push_back((iter->second)[i]);
		    }
	    }
        return result;
    }
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值