(算法)最长单词

题目:

给定一组单词,找出其中的最长单词,且该单词由这组单词中的其他单词组成。

思路:

首选将单词按照字符串大小从大到小排序,然后依次判断该单词是否由其他单词组成。

将单词保存在散列表中,这样容易查找。

判断单词组成:依次切分为左右两个字符串,然后递归查找判断。(为避免重复计算,在每一次递归中都保存中间结果,即把是否可以组成单词的结果都保存在散列表中)

代码:

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

bool canBuildWord(string &str,bool isOriginal,map<string,bool> &mp);

bool cmp(const string &str1,const string &str2){
    int len1=str1.size();
    int len2=str2.size();
    if(len1>len2)
        return true;
    return false;
}

string LongestWord(vector<string> &words){
    int n=words.size();
    string str;
    map<string,bool> mp;

    for(int i=0;i<n;i++)
        mp[words[i]]=true;

    sort(words.begin(),words.end(),cmp);    

    for(int i=0;i<n;i++){
        str=words[i];
        if(canBuildWord(str,true,mp)){
            //cout<<str<<endl;
            return str;
        }
    }
    return "";
}

// IsOriginal: indicate if str is the subString or not
bool canBuildWord(string &str,bool isOriginal,map<string,bool> &mp){
    if(mp.find(str)!=mp.end() && !isOriginal){
        mp[str]=true;
        return true;
    }

    int len=str.size();

    for(int i=1;i<len;i++){
        string left=str.substr(0,i);
        string right=str.substr(i,len-i);
        //cout<<left<<" "<<right<<endl;
        if(mp.find(left)!=mp.end() && mp[left]==true && canBuildWord(right,false,mp))
            return true;
    }
    mp[str]=false;
    return false;
}

int main(){
    int n;
    while(cin>>n){
        vector<string> words(n);
        for(int i=0;i<n;i++)
            cin>>words[i];
        cout<< LongestWord(words) <<endl;
    }
    return 0;
}
时间: 2024-10-10 02:58:41

(算法)最长单词的相关文章

C语言 &#183; 最长单词

算法提高 最长单词 时间限制:1.0s   内存限制:512.0MB 编写一个函数,输入一行字符,将此字符串中最长的单词输出. 输入仅一行,多个单词,每个单词间用一个空格隔开.单词仅由小写字母组成.所有单词的长度和不超过100000.如有多个最长单词,输出最先出现的. 样例输入 I am a student 样例输出 student 1 #include<stdio.h> 2 #include<string.h> 3 #define max 100000 4 int is_zimu

【北航软件工程】最长单词链

Part.1 github链接 Part.2 PSP2.1 Personal Software Process Stages 预计耗时(分钟) 实际耗时(分钟) Planning 计划 15 10 PSP2.1 估计这个任务需要多少时间 15 10 Development 计划 1120 1360 · Analysis 需求分析 (包括学习新技术) 120 150 · Design Spec 生成设计文档 30 30 · Design Review 设计文档复审 10 10 · Coding S

[算法] C# Revert 单词反转字符串[低时间复杂度]

无聊期间想起了一道字符串反转的问题. 大致要求输入"I am a good boy",输出"boy good a am I". 要求不能用已经封装好的方法实现.于是乎,我上网查了一下,基本都是用了封装后类库.于是我自己写了一个小算法,低时间复杂度高空间复杂度的算法. private string Revert(string str) { if (str.Length == 0) { return string.Empty; } string newStr = nul

一步一步写算法(之单词统计)

原文:一步一步写算法(之单词统计) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在面试环节中,有一道题目也是考官们中意的一道题目:如果统计一段由字符和和空格组成的字符串中有多少个单词? 其实,之所以问这个题目,考官的目的就是想了解一下你对状态机了解多少. (1) 题目分析 从题目上看,如果对一个字符串进行处理,那么可以有下面几种情形:初始状态,字符状态,空格状态,结束状态.那么这几种状态之间应该怎么迁移呢? 初始状态: 如果输入符号是

lintcode 容易题:Longest Words 最长单词

题目: 最长单词 给一个词典,找出其中所有最长的单词. 样例 在词典 { "dog", "google", "facebook", "internationalization", "blabla" } 中, 最长的单词集合为 ["internationalization"] 在词典 { "like", "love", "hate"

[算法]判断兄弟单词

一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词.提供一个单词,在字典中找到它的兄弟.描述数据结构和查询过程. #include <iostream> #include <string> #include <cstring> using namespace std; void add(unsigned int count[],char c){ if(c <= 'Z'){ ++count[c - 'A']; } else{ ++cou

CSS3让长单词与URL地址自动换行——word-wrap属性

div{ word-wrap:break-word; } word-wrap属性可以使用的属性值为normal与break-word两个.使用normal属性值时浏览器默认处理,只在半角空格或者连字符的地方进行换行.使用break-word时浏览器可在长单词或URL地址内部进行换行. 目前,word-wrap属性得到了所有浏览器的支持.

英文长单词断行 word-break VS word-wrap

你真的了解word-wrap和word-break的区别吗? 这两个东西是什么,我相信至今还有很多人搞不清,只会死记硬背的写一个word-wrap:break-word;word-break:break-all;这样的东西来强制断句,又或者是因为这两个东西实在是太拗口了,长得又差不多,导致连背都很难背下来. 那它们到底是什么呢?我在mozilla的官网上找到如下的解释: word-wrap word-break 我们看到两个解释中都出现了 break lines within words 这样的

跟着编程之美学算法——最长公共子序列

最长公共子序列是一个很经典的动态规划问题,最近正在学习动态规划,所以拿来这里再整理一下. 这个问题在<算法导论>中作为讲动态规划算法的例题出现. 动态规划,众所周知,第一步就是找子问题,也就是把一个大的问题分解成子问题.这里我们设两个字符串A.B,A = "a0, a1, a2, ..., am-1",B = "b0, b1, b2, ..., bn-1". (1)如果am-1 == bn-1,则当前最长公共子序列为"a0, a1, ...,