`
kmplayer
  • 浏览: 512652 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

返回一个单词的前缀

阅读更多
1,前缀:就是能够代表这个单词的前n个字符,n最小.
如:abc  acc  前缀: ab  ac

语法的悲剧,让我整整浪费了一个上午,郁闷了一个下午.
问题终于还是找到了.

基于string的实现:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std ;

class trie
{
private :
    int sum;
    trie* next[26];
public :
    trie():sum(0)
    {
        for(int i=0;i<26;i++)
            next[i]=NULL;
    }

    ~trie ()
    {
        int i ;
        for ( i = 0 ; i < 26 ; i++ )
        {
            delete next[i] ;
        }
    }
    void insert(string& str)
    {
        trie* tmp=this;
        for(int i=0;i<str.size();i++)
        {
            str[i]|=0x20;

            if(tmp->next[str[i]-'a']==NULL)
                tmp->next[str[i]-'a']=new trie;
            else
                tmp->next[str[i]-'a']->sum++;
            tmp=tmp->next[str[i]-'a'];
        }
    }

    int quary ( string& str )
    {
        trie* tmp=this;
        int n=0;
        for(int i=0;i<str.size();i++)
        {
            str[i]|=0x20;
            tmp=tmp->next[str[i]-'a'];
            n++;
            if(tmp==NULL)
                return n;
            if(tmp->sum==0)
                break;
        }
        return n;
    }
};

int main ()
{
    ifstream in("main.txt");
    string word;
    vector<string> vecstr;

    trie tree;
    while(getline(in,word))
    {
        vecstr.push_back(word);
        tree.insert(word);
    }


    int cnt;
    string pre;
    vector<string> vecpre;
    for(int i=0;i<vecstr.size();i++)
    {
        cnt=tree.quary(vecstr[i]);
        pre=vecstr[i].substr(0,cnt);
        vecpre.push_back(pre);
    }

    for(int i=0;i<vecstr.size();i++)
        cout<<vecstr[i]<<" "<<vecpre[i]<<endl;
	return 0 ;
}


基于const char*的实现:
#include <iostream>
#include <cstring>
#include <fstream>
#include <vector>
#include <cassert>
#include <algorithm>
using namespace std ;

class trie
{
public:
    trie() : sum(0)
    {
        int i;
        for (i = 0; i < 26; i++)
            child[i] = NULL;
    }
    ~trie()
    {
        int i;
        for (i = 0; i < 26; i++)
            delete child[i];
    }

    void insert(const char* key)
    {

        if (*key == '\0')
            return;
        assert((*key >= 'a' ) && (*key <= 'z'));
        int index = *key - 'a';
        if (child[index] == NULL)
            child[index] = new trie;
        else
            child[index] -> sum++;
        child[index] -> insert(key + 1);
    }

    int query(const char* key)
    {

        if (*key == '\0')
            return 0;
        assert((*key >= 'a' ) && (*key <= 'z'));
        int index = *key - 'a';
        if (child[index] == NULL)
            return 0;
        if ((child[index] -> sum) == 0)
            return 1;
        return 1 + child[index] -> query(key + 1);
    }
private:
    int sum;
    trie* child[26];
};
int main ()
{
    ifstream in("1.1.in");
    string word;
    vector<string> vecstr;
    trie t;
    while(getline(in, word))
    {
        //注意全部转化为小写
        for (int i = 0; i < (int)word.size(); i++)
            word[i] |= 0x20;
        //重复的只插入一次
        if (find(vecstr.begin(), vecstr.end(), word) == vecstr.end())
        {
            vecstr.push_back(word);
            t.insert(word.c_str());
        }
    }

    int cnt;
    string pre;
    vector<string> vecpre;
    for(int i = 0; i < static_cast<int>(vecstr.size()); i++)
    {
        cnt = t.query(vecstr[i].c_str());
        pre = vecstr[i].substr(0,cnt);
        vecpre.push_back(pre);
    }
    for(int i = 0; i < static_cast<int>(vecstr.size()); i++)
        cout<<vecstr[i]<<" "<<vecpre[i]<<endl;
	return 0 ;
}

分享到:
评论
1 楼 bhjackson 2010-05-04  
能说说思路么?看不太懂。。。。

相关推荐

    英语常见单词前缀后缀.doc

    英语中的前缀和后缀是构词的重要组成部分,它们能够改变单词的基本意义,扩大词汇量,帮助学习者理解和记忆新单词。前缀位于词首,而后缀则位于词尾。 例如,"a-" 和 "an-" 常用来表示否定或非的意思,如 "asleep" ...

    检查单词是否为句中其他单词的前缀1

    在给定的编程问题中,任务是检查一个检索词(searchWord)是否为句子(sentence)中的某个单词的前缀,并返回对应单词的下标。这个问题可以被归类为字符串处理和搜索算法的问题,通常在面试或LeetCode等在线编程挑战...

    单词接龙1

    【单词接龙1】是一个基于算法的编程挑战,它的核心是设计一个有效的解决方案来找到以特定字母开头的最长单词序列,使得每个单词可以连续连接,且满足特定的规则。在这个游戏中,每个单词最多只能在“龙”中出现两次...

    单词密码日常高频前缀后缀.docx

    2. "-ab-/ac-/af-/ag-/ap-/ar-/as-/at-"是一组加强前缀,如"absorb"(吸收)。 3. "-ad-"表示“做……;加强”,如"adapt"(适应)。 4. "-dis-"有否定或分离的含义,例如"disagree"(不同意)。 5. "-non-"用于否定...

    Connectionist 时间分类 (CTC) 解码算法:最佳路径、波束搜索、词典搜索、前缀搜索和令牌传递_python_代码

    CTC 训练的神经网络的输出mat(numpy 数组,softmax 已经应用)预计具有 TxC 形状,并作为第一个参数传递给解码器。T 是时间步数,C 是字符数(CTC 空白是最后一个元素)。神经网络可以预测的字符作为chars字符串...

    Trie树的插入、查询、删除和部分应用(单词的查询、单词出现频率/DFS和非DFS两种遍历)

    通常需要从最后一个字符开始,如果某个节点只有一个子节点且没有其他单词共享该前缀,那么可以删除该节点;否则,仅删除当前节点表示的单词信息。 对于单词出现频率的统计,可以在每个节点中增加一个计数器,每当...

    快速拼写单词检查 源码

    例如,哈希表通过键值对存储单词,可以实现常数时间复杂度的查找,而Trie树则便于进行前缀匹配,提高搜索效率。 其次,源码部分可能包含了以下几个关键模块: 1. 用户界面:这是用户与程序交互的部分,通常使用...

    深入Elasticsearch:掌握前缀查询的艺术

    2. **拼写检查**:当用户可能输入错误的单词时,提供一个基于正确拼写的前缀匹配列表,帮助用户快速修正错误。 3. **数据过滤**:在一些特定格式的数据字段中(如IP地址、邮政编码等),前缀查询可以帮助快速过滤...

    词典中最长的单词(python sorted+max)1

    首先,我们可以观察到,为了构建一个更长的单词,其前缀必须已经在词典中。因此,我们可以对词典进行排序,以确保先处理较短的单词。 Python 的 `sorted()` 函数在这里起到了关键作用,它可以根据指定的 `key` 参数...

    英语前缀后缀大全

    英语前缀大全是英语学习中非常重要的一部分,它能够帮助学习者更好地记忆单词。英语前缀大全共分为八大类,每类都有其特定的意义和用法。 一、英语前缀大全之否定的前缀 英语中有多种否定的前缀,例如dis-、in-、...

    手稿_V1.087

    然后,在回溯过程中,每当遇到一个新的单词片段,就检查它在前缀树中是否存在。如果不存在,就可以立即停止回溯,节省了大量计算资源。 总结来说,解决“单词搜索II”问题的关键在于巧妙地运用回溯法和合适的数据...

    MFC实现单词模糊查询

    - 编写一个函数,接收用户输入的查询词和字典作为参数,返回匹配的单词列表。在该函数中,对每个单词应用所选的模糊查询算法,并根据计算出的距离或相似度排序。 5. **显示查询结果**: - 将模糊查询函数的结果...

    python-leetcode面试题解之第140题单词拆分II-题解.zip

    2. 从字符串s的第一个字符开始,尝试在前缀树中查找匹配的单词。 3. 如果找到匹配的单词,就将其从字符串s中移除,并继续处理剩下的字符串。 4. 使用递归或者栈结构进行深度优先搜索,每一步都尝试拆分下一个单词。 ...

    英语单词构词法.doc

    总之,英语单词构词法是英语学习中的一个重要部分,它涉及到前缀、后缀和词根的组合及其含义。通过深入研究和应用这些构词规则,学习者可以更加系统地扩大词汇量,提高语言理解能力,从而在英语学习的道路上更进一步...

    完整英语词根前缀后缀表格.doc

    【描述】"完整英语词根前缀后缀表格.doc" 是一个文档,专门列出英语词汇中常见的前缀,用于帮助学习者掌握词缀的用法,从而扩大词汇量和提高语言理解能力。 【标签】"文档"表明这是一个用于教学或学习的文本资料,...

    最全英语词根前缀后缀表.doc

    【描述】中的文件名称表明这是一份详尽的英语词汇学习资料,涵盖了多种常用的前缀,帮助学习者通过识别这些前缀来推测单词的含义。 【标签】"文档"提示我们这是一份文本文件,可能是表格或列表形式,方便查阅和学习...

    Trie:Java项目-使用动态Trie数据结构来组织具有公共前缀的单词的字典

    在这个Java项目中,我们利用动态Trie数据结构来构建一个字典,能够快速地查找和管理具有公共前缀的单词。 Trie数据结构的基本思想是将每个字符作为树的一个节点,根节点代表空字符串。从根节点开始,每个节点都指向...

    前端大厂最新面试题-trie.docx

    3. **搜索自动补全系统**:设计一个系统,当用户输入部分单词时,可以返回所有可能的完整单词。这需要在用户输入每个字符时更新 Trie,并实时提供补全建议。 4. **字符串的索引对**:给定一个字符串数组,找出所有...

    javascript trie前缀树的示例

    此外,还有一个未完成的方法`isContainPrefix`,它应该是用来检查Trie树中是否存在以给定字符串为前缀的单词。 Trie树在实现过程中通常使用数组作为节点的子节点列表,因为JavaScript的数组是动态的,能够适应不同...

    词根词汇速记20000单词音频

    第一部分 通过词缀认识单词(常用前缀一) 1、a- ① 加在单词或词根前面,表示"不,无,非" acentric 无中心的(a+centric 中心的) asocial 不好社交的(a+social 好社交的) amoral 非道德性的(a+moral 道德的;...

Global site tag (gtag.js) - Google Analytics