鱼C论坛

 找回密码
 立即注册
查看: 17719|回复: 20

输入任意一个英文句子,输出最长单词。

[复制链接]
发表于 2013-12-31 09:12:28 | 显示全部楼层 |阅读模式
20鱼币
求大神解答   谢谢!

评分

参与人数 1鱼币 +1 收起 理由
comeheres + 1 去请教自然语言处理专家,这已不是简单编程.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-31 09:22:10 | 显示全部楼层
怎么破     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-31 09:26:44 | 显示全部楼层
呜呜呜  急急:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 09:42:10 | 显示全部楼层
1.建立一个足够放下句子的字符串。例如char[100];按照实际情况来确定数组的大小。
2.然后将输入的句子保存到字符串中。
3.开始寻找最长单词:
    1)定义一个临时字符串,用于记录单词。
    2)再定义一个用于记录最长单词的字符串。
    3)开始从英文句子中分离单词,如果遇到非字母结尾的都是一个单词。
    4)然后记录该单词的长度,并把单词保存到最长单词字符串中。
    5)以此类推,每次遇到比当前字符串长的单词时都要重新保存最长单词字符串。
4.这就是最普通的思路了,按照这个写吧,代码不提供了,编程重要的就是思想,至于如何实现,这是看你基本功的时候了,想学好编程就要自己多写,自己写出来的才能体会到正真的快乐。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-31 09:50:25 | 显示全部楼层
那个单词之间不可以有那空格,例如:aaabbcccc,输出的是cccc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-12-31 09:59:12 | 显示全部楼层
不会高深的,不过应该可以通过判断空格来记录单词长度,最后比较一下就是了。多动手。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 10:08:01 | 显示全部楼层
如果没有空格做分隔符的话,计算机是没有那么智能的,它怎么会认识哪个是真正的单词呢,一般的方法如下:1. 用strtok函数把这句英文中的单词按" "来分隔(因为一般英文句子中都是以空格来分开每个单词的).
      2. 然后遍历找出来的单词,得到最长单词的长度是多少.
      3. 最后再去遍历一次这些单词,把长度等于最长长度的单词打印出来.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 12:48:38 | 显示全部楼层

楼主的意思是说 输入:myworld,输出的是world   ?
这样的话,很难实现的,因为没有空格识别起来会产生很多歧义的。。。。
比如TODO,可以认为是TODO的意思,也可以理解为to do
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 14:52:40 | 显示全部楼层
呵呵,不带空格的英文句子还叫句子吗?这已经涉及到自然语言的处理了,人家的英文分词还是要根据句子的空格来的。

如果不带空格,那先得划分句子,即使有词典,但也难以解决识别比如his和history的问题。所以楼主这蛋疼的问题别再问了,几乎是不可能完成的任务
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-12-31 14:57:02 | 显示全部楼层
er88438 发表于 2013-12-31 09:50
那个单词之间不可以有那空格,例如:aaabbcccc,输出的是cccc

有空格是分分钟的事,不带空格是一大难题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-4 21:13:10 | 显示全部楼层
带空格还不好办啊 一句话能有几个单词大不了排下序呗 每空格的话  ╭(╯^╰)╮不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-5 16:15:57 | 显示全部楼层
办法有,先建一个英语单词词典,后比对输入的字符,就是了。:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-5 20:05:43 | 显示全部楼层
本帖最后由 结束点№ 于 2014-1-5 20:06 编辑

需要字库对比的吧.. 输入一系列字母字符串,截取第一个字符,开始向后取第二个字符,组成新的字符串,对比字库:
1)字库包含有,则继续取第三个字符组成新的字符串,继续对比字库,如果字库包含有,则继续取一系列字母字符串第四个字符组成新的字符串,直到没有,记录该新的字符串的长度和内容,存放进变量中
2)字库中没有,则从一系列字母字符串取第二个字符,从第二个字符又向后取字符,组成新的字符串,重复1)..


最后从保存的变量中遍历出长度最大的值,应该就是你需要的了吧

需求的英文单词字库 应该很庞大才对..


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-6 23:05:54 | 显示全部楼层
找2个空格之间最长的距离,就是最长的单词
从串首到第一个空格的长度 放入变量1
第一个空格到第二个空格的距离放入变量2,比较变量1和2 哪个大留哪个放变量1里面
第二个空格到第三个空格的距离放入变量2,比较变量1和2 哪个大留哪个放变量1里面
....................
就能达到要求
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-7 17:53:45 | 显示全部楼层
本帖最后由 五号智能 于 2014-1-9 03:38 编辑
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;

  5. int main()
  6. {
  7.         vector <string> a;
  8.         string b;
  9.         cout<<"请输入语句,按Ctrl+Z结束"<<endl;
  10.         while(cin>>b)
  11.         {
  12.                 a.push_back(b);
  13.         }
  14.         size_t t=0;
  15.         size_t big;
  16.         for(size_t i=0; i<a.size(); i++)
  17.         {
  18.                 if (t<a[i].size())
  19.                 {
  20.                         t=a[i].size();
  21.                         big=i;
  22.                 }
  23.         }
  24.         cout << a[big]<<endl;
  25.         system("pause");
  26. }
复制代码
这里怎么都是钻死牛角的人呢,正常人打语句,单词间那有不留空格的.
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;

  5. int main()
  6. {
  7.       vector <string> a;
  8.       string b;
  9.       size_t t=0;
  10.       size_t big;
  11.       size_t i=0;
  12.       cout<<"请输入语句,按Ctrl+Z结束"<<endl;
  13.       while(cin>>b)
  14.       {
  15.             a.push_back(b);
  16.             if (t<a[i].size())
  17.            {
  18.                  t=a[i].size();
  19.                  big=i;
  20.            }
  21.            i++;
  22.         }
  23.         cout << a[big]<<endl;
  24.         system("pause");
  25. } //优化了一下.
复制代码
随便提一句,这网页里的代码段有问题,不自动排版.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-9 03:34:21 | 显示全部楼层
不要忘结贴啊,我还等着升级呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-1-25 22:22:31 | 显示全部楼层
这是当初我学小强那本书的一道题,看看吧
#include<stdio.h>
int i,j,n=0,m=0,max,x1=0,y1=0;
char str1[1000][1000],aa[10000];
int str2[1000];
int main()
{
        printf("输入字符以空格结尾\n非字母算作空格\n");
        gets(aa);
                for( i=0;(aa[i])!='\0';i++)
        {       
                if(((aa[i]>=1)&&(aa[i]<=64))
                        ||((aa[i]>=91)&&(aa[i]<96))
                        ||((aa[i]>=123)&&(aa[i]<=255)))
                {
                        if(i==0) goto jump;//首字符为空格跳出
                        if(((aa[i-1]>=65)&&(aa[i-1]<=90))
                        ||((aa[i-1]>=97)&&(aa[i-1]<=122)))//连续按空格无效
                        {
                                if(n>=max)
                                {
                                        max=n;//单词最大长度
                                }
                                n=0;m++;
                        }
                }
jump: ;
                if(((aa[i]>=65)&&(aa[i]<=90))
                        ||((aa[i]>=97)&&(aa[i]<=122)))
                {
                        str1[m][n]=aa[i];                        //将单词赋给新数组
                        n++;                                //没按下一个非空格加一
                        str2[m]=n;                        //定义新数组储存每个单词长度
                }
        }
        for(j=0; j<m; j++)
        {        if(str2[j]==max)//找到第几个单词长度=最长
                                printf("最长单词\t%s\n长度\t%d\n位置:第%d个\n\n",
                                        str1[j],max,j+1);
        }               
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-7 15:47:20 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-16 00:49:10 | 显示全部楼层
去查查msdn的库函数看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-10 16:48:35 | 显示全部楼层
#include
using
namespace
std;
const
int
max
=
20;
int
main()
{
unsigned
int
maxlen
=
0;
int
len
=
0;
int
i=0;
string
str[max];
cout
<<
"请输入一段字符串(ctrl+z)完成输入:\n";
getline(cin,str[i],'
');
while
(cin)
{
if
(maxlen
<
str[i].size())
{
maxlen
=
str[i].size();
len
=
i;
}
++i;
getline(cin,str[i],'
');
}
cout
<<
"最长字符串味:\n";
cout
<<
"第
"
<<
i
<<
"个,字符长度为:"
<<
maxlen
-
1
<<
"
\n字符串为:"
<<
str[len]
<<
endl;
system("pause");
}
下面是使用了vector
的方法
#include
#include
#include
using
namespace
std;
int
main()
{
vector
sv;
string
str;
int
maxlen
=
0;
int
len
=
0;
cout
<<
"请输入一段字符串(ctrl+z)完成输入:\n";
getline(cin,str,'
');
while
(cin)
{
sv.push_back(str);
if
(maxlen
<
str.size())
{
maxlen
=
str.size();
len
=
sv.size();
}
getline(cin,str,'
');
}
cout
<<
"共有"
<<
sv.size()
<<
"个词组\n"
;
cout
<<
"最长字符串味:\n";
cout
<<
"第
"
<<
len
<<
"个,字符长度为:"
<<
maxlen
<<
"
\n字符串为:"
<<
***.at(len-1)
<<
endl;
system("pause");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 00:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表