算法与数据结构(2)--英雄会第三届在线编程大赛:几个bing
基础知识的回顾不再写到这里面了,会写一些算法算法的解答或者读一些相关书籍的笔记。
今天做了一道算法题,来自微软必应·英雄会第三届在线编程大赛:几个bing?
做出来了。。。但不知道为啥执行测试用例失败,也许不对吧,求大神帮这看一下,有兴趣的可以去做做,地址
本届大赛由微软必应词典冠名,必应词典(Bing Dictionary)是微软推出的新一代英语学习引擎,里面收录了很多我们常见的单词。但现实生活中,我们也经常能看到一些毫无规则的字符串,导致词典无法正常收录,不过,我们是否可以从无规则的字符串中提取出正规的单词呢?
例如有一个字符串"iinbinbing",截取不同位置的字符'b'、'i'、'n'、'g'组合成单词"bing"。若从1开始计数的话,则'b'、'i'、'n'、'g'这4个字母出现的位置分别为(4,5,6,10) (4,5,9,10),(4,8,9,10)和(7,8,9,10),故总共可以组合成4个单词”bing“。
咱们的问题是:现给定任意字符串,只包含小写'b'、'i'、'n'、'g'这4种字母,请问一共能组合成多少个单词bing?
字符串长度不超过10000,由于结果可能比较大,请输出对10^9 + 7取余数之后的结果。
思路
先找到第一个b和最后一个g,锁定字符串。
然后遍历一边从第一个b到最后一个g的字符串片段,分别将其放到4个链表里,链表结构体如下:
struct LNode
{
int data; // 该结点在字符串中的位置
int num; // 该结点之后的组合有多少种
struct LNode *next; // 下一个结点
}LNode, *LinkedList;
其中的num可能比较难以理解,我举个例子,若字符串为"binbignngg",则最后一个g的num为1,倒数第二个为2,即在取到相应的g时,g及其后的字符串组合的可能性为几。倒数第一个n的话,它的num为2,代表的是ng组合的可能。倒数第一个i的num为4,即ing组合的可能性。依次往前推即可。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> struct LNode
{
int data; // 该结点在字符串中的位置
int num; // 该结点之后的组合有多少种
struct LNode *next; // 下一个结点
}LNode, *LinkedList; // 单链表的初始化
LinkedList LinkedListInit()
{// 建立一个空的单链表
LNode *L = (LNode*)malloc(sizeof(LNode));
if(L == NULL)
{
exit();
}
L->next = NULL;
L->data = ;
L->num = ;
return L;
} LinkedList LinkedListInsert(LinkedList L, int data, int num)
{// 用头插法插入结点
LNode *p = (LNode *)malloc(sizeof(LNode));
p->data = data;
p->num = num;
p->next = L->next;
L->next = p;
return L;
} LinkedList getNum(LinkedList UL, LinkedList DL)
{// 由后往前推出个数
LinkedList up = UL,
uq = UL->next,
dp = DL,
dq = DL->next,
last = NULL; while(dq)
{
while(uq && dq->data < uq->data)
{
up = uq;
if(up == last)
{
break;
}
uq = uq->next;
}
last = up;
dq->num = up->num + dp->num; // 前一个字母顺序的个数和该字母顺序的前一个个数
dp = dq;
dq = dq->next;
}
printf("\n");
return DL;
} int howmany (char* s)
{
int dataLen = strlen(s),
start = ,
end = ,
first = ,
i = ,
gLen = ; if(dataLen < )
{
return ;
} // 初始化链表
LinkedList bData = LinkedListInit(),
iData = LinkedListInit(),
nData = LinkedListInit(),
gData = LinkedListInit(); for (; i < dataLen; i++)
{
if(first && s[i] == 'b')
{
start = i;
first = ;
}
else if(s[i] == 'g')
{
end = i;
}
} // 根据字符串插入链表数据
for (i = start; i <= end ; i++)
{
switch(s[i])
{
case 'b':
bData = LinkedListInsert(bData, i, );
break;
case 'i':
iData = LinkedListInsert(iData, i, );
break;
case 'n':
nData = LinkedListInsert(nData, i, );
break;
case 'g':
gLen++;
gData = LinkedListInsert(gData, i, );
break;
default:
return ;
}
}
LinkedList p = gData->next;
i = ;
while(p)
{
p->num = i;
i++;
p = p->next;
}
nData = getNum(gData, nData);
iData = getNum(nData, iData);
bData = getNum(iData, bData); LinkedList lastB = bData->next;
while(lastB->next)
{
lastB = lastB->next;
}
int result = lastB->num;
return (int)result%(int)(pow(, ) + );
} int main()
{
printf("%d",howmany("Test"));
}
算法与数据结构(2)--英雄会第三届在线编程大赛:几个bing的更多相关文章
- 微软必应·英雄会第三届在线编程大赛:几个bing?
发布公司:微软亚太研发集团 有 效 期:2013-12-31至2014-02-01 难 度 等 级: 答 题 时 长:120分钟 编程语言要求:C C++ Java C# 悬赏详情 一等奖 : 价值2 ...
- [转]微软联合CSDN英雄在线编程大赛
2014 新年将至,微软联合CSDN英雄会共同举办本次第三届在线编程大赛,题目详情如下: 有一个字符串"iinbinbing",截取不同位置的字符‘b’.‘i’.‘n’.‘g’组合 ...
- 庞果英雄会第二届在线编程大赛·线上初赛:AB数
题目链接 给定两个正整数a,b,分别定义两个集合L和R, 集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 <= x <=a , 1 <= ...
- CSDN第四届在线编程大赛2014初赛:带通配符的数
题目要求: 输入参数:参数A,含有任意个数的?的数值字符串,如:12?4,?代表一位任意数 参数B,不含?的数值字符串,长度与参数A一致输出结果:参数A比参数B大的可能数值个数 ...
- 【思考题】CSDN第四届在线编程大赛2014初赛:带通配符的数
题目要求: 输入参数:参数A,含有任意个数的?的数值字符串,如:12?4,?代表一位任意数 参数B,不含?的数值字符串,长度与参数A一致 输出结果:参数A比参数 ...
- csdn第五届在线编程大赛-全然平方
题目详情 给定整数区间[A,B]问当中有多少个全然平方数. 输入格式: 多组数据,包括两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包括一个 ...
- Python超级码力在线编程大赛初赛题解
P1 三角魔法 描述小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后, ...
- [ios-必看] 国人当自强:两岸三地在线编程学习网站大搜罗 [转]
http://blog.csdn.net/lyy_whg/article/details/17350923 说到国内的在线编程学习网站,很多人都是一脸茫然,即使是资深开发者也是如此.在许多人眼中,尽管 ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
随机推荐
- 《利用Python进行数据分析》第8章学习笔记
绘图和可视化 matplotlib入门 创建窗口和画布 fig = plt.figure() ax1 = fig.add_subplot(2,2,1) ax2 = fig.add_subplot(2, ...
- c语言到汇编的学习
[内存结构] C程序通过编译-汇编-连接,最后到可执行文件.载入内存有这几个部分: text:正文段,存放的是可执行的机器码段 data:存放初始化之后的全局变量和静态变量 bbs:存放未初始化的静态 ...
- C++混合编程之idlcpp教程Python篇(5)
上一篇在这 C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...
- 【源码分享】WPF漂亮界面框架实现原理分析及源码分享
1 源码下载 2 OSGi.NET插件应用架构概述 3 漂亮界面框架原理概述 4 漂亮界面框架实现 4.1 主程序 4.2 主程序与插件的通讯 4.2.1 主程序获取插件注册的服务 4.2 ...
- 【腾讯Bugly干货分享】安卓单元测试:What, Why and How
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d28349101cd07a5404c415 Dev Club 是一个交流移动 ...
- Linux3:more、which、find、chmod、tar、diff、grep、ps、netstat、uname
more 类似cat,不过more不是将整个文件内容从上到下显示在屏幕上的,而是以一页一页的显示方便使用者逐页阅读.more最基本的指令就是space即往下翻一页,b即往回翻一页显示,而且还有搜索字符 ...
- Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
CyclicBarrier 接着讲多线程下的其他组件,第一个要讲的就是CyclicBarrier.CyclicBarrier从字面理解是指循环屏障,它可以协同多个线程,让多个线程在这个屏障前等待,直到 ...
- 一个App完成入门篇(一)-从Hello world开始
程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...
- Wix 安装部署教程(十二) -- 自动更新WXS文件
上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样 ...
- channel vs mutex
记录许总演讲PPT指出的实践: channel– 本质上是一个 MessageQueue– 非常正统的执行体间通讯设施• sync.Mutex/RWMutex/Cond/etc– 不要把 channe ...