Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words)目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。

  解:简化题目:从一个字符串A中找出包含另一个字符串B所有字母的最小字串。(比A短,并每个字母只出现一次;这里先排除了关键词多次出现的情况,这种情况只需稍微改动即可),考虑使用两个指针p、q指向A起始位置,遍历指针p,

1、使得q到p之间包含了B中的所有字母。这时可以是使用一个数组来记录p中走过A中遇到B中字母出现的次数。这样当所有字母全非0的时候,即可。这时未能保证q到p是以*p结尾子句中包含所有字母的最短的一个。

2、此时走动q指针,另q走到恰好q到p是以*p结尾子句中包含所有字母的最短的一个。

如A=dccdaadc B=cda

经过第一步,q指向A[0],p指向A[4] 计数数组 221 字串dccda并不是以A[4]结尾子句中最短的包含B的子串

然后,走q指针。走过A[1]时,计数数组121,即此时还是包含了B(ccda),所有继续再走;直到A[2]时,计数数组为111,下一个将出现不能包含B的全部字母所以此时A[2]~A[4]为以A[4]结尾子句中包含所有字母的最短的一个。

3、然后记录相应信息。q走过一个,使得q~p未能包含全部的B,这时又回到了第一步,直至整个字符串检测完毕。

这里的代码并未考虑关键字出现多次的情况。这种情况只需要稍做改动即可;

  1 #include <iostream>
  2
  3 using namespace std;
  4
  5
  6 //p指向的单词(空格结尾或'\0'),在关键词组中是否存在,存在则相应计数;当所有关键字计数
  7 //不为0,即包含了所有的关键字了,以*flag回传1
  8 //返回单词的后一个位置(若为'\0'则返回'\0')
  9 char* countkw_add(int cnt[], char *p, char * kw[], int n, int *falg)  //
 10 {
 11     char *q;
 12     char tmp[50]={0};
 13     q = tmp;
 14     while(*p && *p!=' ')*q++ = *p++;
 15
 16     *q = '\0';
 17
 18     for (int i=0; i<n; i++)
 19     {
 20         if (strcmp(tmp, kw[i])==0)
 21         {
 22             cnt[i]++;
 23             for(int j=0; j<n; ++j)
 24             {
 25                 if (!cnt[j])
 26                 {
 27                     break;
 28                 }
 29             }
 30             if (j==n)
 31             {
 32                 *falg  = 1;  //包含了所有的关键字
 33             }
 34             break; //找到
 35         }
 36     }
 37     while(*p && *p++!=' '); //
 38
 39     return p;
 40 }
 41 //由于只有计数数组cnt的数据全非零时才调用此函数
 42 //p指向的单词(空格结尾或'\0'),在关键词组中是否存在,存在则减去相应计数;当存在关键字计数
 43 //不为0,即未包含所有的关键字了,以*flag回传0
 44 //返回单词的后一个位置(若为'\0'则返回'\0')
 45 char* countkw_sub(int cnt[], char *p, char * kw[], int n, int *falg)
 46 {
 47     char *q;
 48     char tmp[50]={0};
 49     q = tmp;
 50     while(*p && *p!=' ')*q++ = *p++;
 51
 52     *q = '\0';
 53
 54     for (int i=0; i<n; i++)
 55     {
 56
 57         if (strcmp(tmp, kw[i])==0)
 58         {
 59             cnt[i]--;
 60
 61             if (cnt[i]==0)
 62             {
 63                 *falg  = 0;  //缺关键字kw[i]
 64             }
 65             break; //找到
 66         }
 67     }
 68     while(*p && *p++!=' '); //
 69
 70     return p;
 71 }
 72
 73 void extractSummery(char *des, char * keywords[], int n, char **beg, char **end)
 74 {
 75     char *p,*q;
 76
 77     int  *cnt;
 78     int minlen=strlen(des); //
 79     *beg = NULL;
 80     *end = NULL;
 81
 82     cnt = (int *)malloc(sizeof(int)*n);
 83     memset(cnt, 0, sizeof(int)*n);
 84
 85
 86     q= des;
 87     while(*q!='\0' && *q==' ')q++;
 88
 89     p = q;
 90     int fulled=0;
 91
 92     while(*p!='\0')
 93     {
 94
 95         p = countkw_add(cnt,p,keywords,n, &fulled);
 96
 97         while(*p && *p==' ')p++;
 98
 99         if (fulled) //包含了所有的关键字
100         {
101             char *tmp;
102             tmp = q;
103             while(fulled)
104             {
105                 q = tmp; //记录上一次
106                 tmp= countkw_sub(cnt,tmp,keywords,n, &fulled);
107             }
108
109             if (p-q<minlen) //发现更小的,则更新
110             {
111                 minlen = p-q;
112                 *beg = q;
113                 *end = p;
114             }
115             //while(*q && *q!=' ')q++;
116             q = tmp;
117             while(*q && *q==' ')q++; //指向下一个词
118         }
119
120
121
122     }
123 }
124
125
126
127
128 int main()
129 {
130     char des[] = "aefo aec egne a se a fe a aec ve  fjfj as lel";
131
132     char *kw[] = {"aec" ,"a", "fjfj"};
133     char *b,*e;
134
135     extractSummery(des,kw,3,&b,&e);
136
137     for(char *p=b; p<e; p++)
138     {
139         cout<<*p;
140     }
141
142     cout<<endl;
143
144     return 0;
145 }

---恢复内容结束---

转载于:https://www.cnblogs.com/legendmaner/archive/2013/03/17/2965030.html

Alibaba笔试题:根据关键字求最短摘要字串相关推荐

  1. 图解全排列问题_一道笔试题(122345求有条件全排列)的两种做法

    packagecom.heyang.p122345;importjava.util.HashSet;importjava.util.Set;/*** 用1.2.2.3.4.5这六个数字,用java写一 ...

  2. php井字游戏代码_PHP初级笔试题:Tic-Tac-Toe(n阶井字棋)判断胜负

    //Tic-Tac-Toe $n = 5;//五阶棋盘 $res = array(); function check($arr) { $n = $GLOBALS['n']; $res = $GLOBA ...

  3. 2012九月十月腾讯,网易游戏,百度最新校园招聘笔试题

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题) 引言 此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网易游戏,百度等各大公司最 ...

  4. 程序员必看 c++笔试题汇总

    ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题.比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3-& ...

  5. 校招笔试C语言,校招c ++笔试题汇总

    ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题, 最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后 ...

  6. c++笔试题整理(二)

    笔试才发现很多基本的东西都忘记了,以后面试前要看看这篇文章了!唉,老了! ①链表反转 单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题.比如一个链表是这样的: 1->2-> ...

  7. c++笔试题大整合(完整)

    单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题.比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2-& ...

  8. 笔试题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。该题有三种解法:递归的方法求解斐波那契数列、用概率与统计的数学方法解决,3.动态规划

    笔试题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法.该题有三种解法:1.递归的方法求解斐波那契数列.2.用概率与统计的数学方法解决,3.动态规划 ...

  9. 【ForOffer】【深信服--测试开发岗笔试题】求最少车费求最低位找马甲找字符串子串

    深信服的整体笔试题难度一般,有多刷题的经验,能立马找出了题意理解,在此,自己只是做个总结发出,有更好的解法的童靴可以一起交流,其实这四道题都是常见题型的一种变形.代码照着搬都是没有问题的哦! 第一题: ...

最新文章

  1. svm通俗易懂的理解
  2. 476. 数字的补数
  3. Java NIO学习
  4. 大创中期报告怎么写_课题研究中期报告怎么写?这篇范文很说的很详细
  5. spring 随笔(一) bean Dependency Injection
  6. IOTA基金会宣布推出终端用户钱包Firefly
  7. HDU2612---(两次BFS)
  8. Could not find a version that satisfies the requirement PyQt5
  9. 100台电脑无盘服务器配置,100台网吧无盘系统配三星840PRO方案解读
  10. 关于国标码最后一位校验码计算方法
  11. 简单的内网穿透接入互联网无需公网IP
  12. 机器人 大战 android,机器人未来大战
  13. 解决ubuntu14 restart mysql提示stop Unknown job:mysql问题
  14. 【双评价学习笔记2019】农业生产适宜性评价01·土地资源评价
  15. 快速接入腾讯TUIKaraoke在线 K 歌场景
  16. 用rose建立数据库表
  17. 开题报告中外文文献的查询和引用
  18. android组件的下拉回弹,Android自定义控件仿ios下拉回弹效果
  19. 软件工程毕业设计课题(81)微信小程序毕业设计PHP校园跑腿小程序系统设计与实现
  20. teradata CAST

热门文章

  1. php指定长度 分割整形,php指定长度分割字符串str_split函数用法示例
  2. python绘制球体_趣学Python之弹球游戏第一阶段--画个红球
  3. 死信交换机与死信队列
  4. 009_IOC注解开发
  5. html桌面卡牌效果,html+css实现响应式卡片悬停效果
  6. 吴军信息论40讲_吴军信息论40讲笔记
  7. 处理机调度实验总结_计算机系统结构总结
  8. 细说 Lambda 表达式
  9. Java数据结构和算法:哈夫曼树
  10. 自定义组合控件:Banner、轮播图、广告栏控件