找到所有变位词

typedef std::list<std::string>      List;
typedef std::map<std::string, List> Map;

Map getAnagrams(List& input)
{
    Map result;
    for (const auto& s : input){
        auto key = s;
        std::sort(key.begin(), key.end());
        auto loc = result.find (key);
        if (loc != result.end ()){
            loc->second.push_back (s);
        }else{
            result.insert ({key, List{s}});
        }
    }
    return result;
}
时间: 2024-12-15 01:48:23

找到所有变位词的相关文章

变位词的查找(上)

本文也同步发表在我的公众号"我的天空" 这次我们聊一个比较有意思的话题:变位词的查找,这个话题在<编程珠玑>中出现,此书很经典,偏向于算法,大家如果能通读的话,肯定受益匪浅!   什么是变位词 不同的单词,如果其组成的字母相同的话,那么这些单词就互为变位词,譬如pots.stop. tops这三个单词就是互为变位词,都是由字母p.o.t.s组成,但是"pot" 就不与上述单词互为变位词,其缺少字母s,"potss"也不是,其多了一个字

变位词的查找(下)

本文也同步发表在我的公众号"我的天空" 实现方案优劣的思考 之前我们的实现方案的优点是一旦目标词库的签名建立后,则变位词的查找会变得简单而快速:缺点是由于在生成目标词库时,要为每个词都生成签名,导致生成词库的时间会变慢,同时会消耗空间.对于那些没有被查找到的字符串的签名实际上是浪费的. 测试结果:在CPU为Inter Core i3-2328M,内存为6GB的PC上生成数量为1万的目标词库平均时间为377毫秒,查找变位词的平均时间为11毫秒.   第二种方案 在生成目标词库的时候并不生

变位词

题目描述: 如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,比如bad和adb即为兄弟字符串,现提供一个字符串,如何在字典中迅速找到它的兄弟字符串,请描述数据结构和查询过程. 思路一:用计数排序 设计一个数组,对单词每个字母计数加1,对兄弟单词每个字母计数减去1,如果最后这个数组的计数是0,那么就为兄弟单词 bool isBrotherWord(string &str1, string &str2) { int len1 = str1.length(); int len2 =

第二章:Rotate、变位词

1.向量旋转 将一个具有n个元素的一维向量左旋i位. 1.1使用i个额外空间 void left_rotate(string &s,int i){ string s2(s,0,i);//将前i个字符复制到s2 int j=0; //将剩余n-i个元素左移i个位置 for(;i<s.size();i++){ s[j++] = s[i]; } //将s2复制到s的后面部分 for(int k=0;k<s2.size();k++){ s[j++] = s2[k]; } } 1.2定义一个函数

数据结构与算法(3)——变位词判断问题

什么是变位词 两个词之间存在得组成字母重新排列关系,用bool类型返回是否是变位词.如python和typhon 解法 1.逐字比较 #s1和s2依次遍历比较 def anagramSulution1(s1,s2): alist = list(s2) #将s2复制成list pos1 = 0 stillOK = True while pos1< len(s1) and stillOK: #循环s1每个字符 pos2 = 0 found = False while pos2 < len(alis

写一个函数对字符串数组排序,使所有变位词都相邻

题目 写一个函数对字符串数组排序,使得所有的变位词都相邻. 解答 首先,要弄清楚什么是变位词.变位词就是组成的字母相同,但顺序不一样的单词. 比如说:live和evil就是一对变位词.OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了.它要求我们在排序的过程中,按照变位词的准则来排序. 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数. 一般情况下我们如果要排序一个长度为n的数组A,我们可以这

005推断两个字符串是否是变位词 (keep it up)

写一个函数推断两个字符串是否是变位词. 变位词(anagrams)指的是组成两个单词的字符同样,但位置不同的单词.比方说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们能够排序然后对照, 也能够直接统计字符出现的个数来推断.这里给出统计字符来推断的代码: bool isAnagram1(const string& vLeft, const string& vRight) { if (vLeft.size() != vRight.size()) return false; i

互为变位词

// 判断两个单词是否互为变位词: 如果两个单词中的字母相同,并且每个字母出现的次数也相同, 那么这两个单词互为变位词 #include <stdio.h> #include <string.h> int is_anagram(char *s1, char *s2) // 判断两个数是否互为变位词, 若是返回1 { if(strlen(s1) != strlen(s2)) return 0; int count[256] = {0}; char *p; p = s1; while(

CareerCup之1.4判断字符串是否为变位词

[题目] 原文: 1.4 Write a method to decide if two strings are anagrams or not. 译文: 写一个函数判断两个字符串是否是变位词. [分析] 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词.该题目有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了. The eyes