码迷,mamicode.com
首页 > 其他好文 > 详细

Anagrams

时间:2014-07-16 20:35:59      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   for   io   

  这题Leetcode上面的描述不清楚。怎么也得举两个例子吧,不然谁懂?

  题目的意思是,给定一些字符串,比如["abc","cba","bac","abcd"],找出可以通过交换位置获得的所有字符串。那么这个例子中,返回的结果就是["abc","cba","bac"]。题目隐藏了一个假设,也就是只有一组这样的结果。

  理解了题目的意思的话,其实非常简单:遍历字符串,为字符相同的字符串生成一个key,放到map中。key相同的就是可以通过互换字符位置变换而来的。那么key怎么生成呢?最简单的,就是对字符串按照字母表升序进行排序。那么"abc","cba","bac"都对应"abc"这一个key。当然,对map的处理,要进行一些判断来区分第一次访问、已访问等。代码如下:

  

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

  这里生成key是用普通的sort方法,复杂度Nlog(N)。由于字符是小写字母,只有26个,因此可以采用计数排序,复杂度可以降到log(N)。(这里的N是指字符数)。

Anagrams,布布扣,bubuko.com

Anagrams

标签:style   blog   color   os   for   io   

原文地址:http://www.cnblogs.com/zhizhizhiyuan/p/3836679.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!