当前位置: 首页 > 编程日记 > 正文

hihocoder 1152 Lucky Substrings

#1152 : Lucky Substrings

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Given a string consisting of only lower case letters, output all its lucky non-empty substrings in lexicographical order. Same substrings should be printed once.

输入

A string consisting no more than 100 lower case letters.

输出

Output the lucky substrings in lexicographical order, one per line. Same substrings should be printed once.

样例输入
aabcd
样例输出
a
aa
aab
aabc
ab
abc
b
bc
bcd
c
cd
d

题目大意:
给定一个只包含小写字母的字符串S。对于S的任意一个非空子串,若其包含的不同字母个数为fibonacci数列中的数,
则我们认为这个子串为幸运的。请找出S的所有幸运的子串。
不要重复输出。

解题思路

一个简单的解题思路是直接枚举S的所有子串,并对其不同字母个数进行统计。

S均由小写字母组成,因此其包含的不同字母个数最多为26个。而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21。因此只有当子串中不同字母的个数为1,2,3,5,8,13,21时,该子串才是幸运的。

接下来即是如何统计一个子串的不同字母个数,下面给出一种比较朴素的方法:

isLucky(subString):alphabet[] = falsecount = 0For c in subStringIf not alphabet[c] Thenalphabet[c] = truecount = count + 1End IfEnd ForReturn (count is Fibonaccid number)

S的最大长度为 N = 100,该朴素算法的时间复杂度为O(N^3),是可以通过所有数据的。

同时,我们可以通过一个小的优化,将算法的时间复杂度减少的O(N^2)。

在已经知道S[i..j]字母个数的情况下,我们可以直接推导出S[i..j+1]的不同字母个数。

首先我们需要改进isLucky函数:

alphabet[] = false
count = 0
isLucky(c):If not alphabet[c] Thenalphabet[c] = truecount = count + 1End IfReturn (count is Fibonaccid number)

这里我们把alphabetcount从函数中抽取出来,作为了全局变量。同时,isLucky的参数变为单个字符,每次将新增的S[j+1]加入统计中。

下面是函数的主体部分:

For i = 0 .. len - 1alphabet[] = falsecount = 0For j = i .. len - 1// 此时isLucky返回的是S[i..j]的不同字母数量是否满足条件If isLucky(S[j]) ThenansList.push(S[i..j])End IfEnd For
End For

最后只需要将ansList所保存的子串进行排序去重后输出,即可顺利通过该题目。

 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <set>
 6 using namespace std;
 7 string s;
 8 
 9 bool IsFibonaccidNum(int n){
10     return (n == 1 || n == 2 || n == 3 || n == 5 || n == 8 || n == 13 || n == 21);
11 }
12 
13 bool isLucky(int i, int j){
14     int alphabet[26] = {0};
15     //memset(alphabet, 0, sizeof(alphabet));
16     int count = 0;
17     for(int k = i; k <= j; k++){
18         if(alphabet[s[k] - 'a'] == 0){
19             alphabet[s[k] - 'a'] = 1;
20             count++;
21         }
22     }
23     return (IsFibonaccidNum(count));
24 }
25 
26 int main(){
27     set<string> set1;
28     cin >> s;
29     int len = s.length();
30     for(int i = 0; i < len; i++){
31         for(int j = i; j < len; j++){
32             if(isLucky(i, j)){
33                 string str = s.substr(i, j - i + 1);
34                 set1.insert(str);
35             }
36         }
37     }
38     
39     for(set<string>::iterator it = set1.begin(); it != set1.end(); it++){
40         cout << *it << endl;
41     }
42     //system("pause");
43     return 0;
44 }
 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <set>
 6 using namespace std;
 7 int alphabet[26] = {0}, cnt;
 8 
 9 bool IsFibonaccidNum(int n){
10     return (n == 1 || n == 2 || n == 3 || n == 5 || n == 8 || n == 13 || n == 21);
11 }
12 
13 bool isLucky(char c){
14         if(alphabet[c - 'a'] == 0){
15             alphabet[c - 'a'] = 1;
16             cnt++;
17         }
18     return (IsFibonaccidNum(cnt));
19 }
20 
21 int main(){
22     set<string> set1;
23     string s;
24     cin >> s;
25     int len = s.length();
26     for(int i = 0; i < len; i++){
27         memset(alphabet, 0, sizeof(alphabet));
28         cnt = 0;
29         for(int j = i; j < len; j++){
30             if(isLucky(s[j])){
31                 string str = s.substr(i, j - i + 1);
32                 set1.insert(str);
33             }
34         }
35     }
36     
37     for(set<string>::iterator it = set1.begin(); it != set1.end(); it++){
38         cout << *it << endl;
39     }
40     //system("pause");
41     return 0;
42 }




转载于:https://www.cnblogs.com/qinduanyinghua/p/5828450.html

相关文章:

随笔,记2014忆往昔岁月

博客园开通了一年多&#xff0c;这是第一篇博客。在此记下我的第一篇博客&#xff0c;同时&#xff0c;回忆过去几年自己的工作所得所想所感。 大学毕业&#xff0c;工作两年半了&#xff0c;做过很多事&#xff0c;比较杂&#xff0c;做过需求&#xff0c;做过设计&#xff0c…

PHP相关关系及定义

CGI(是一种协议): 是为了保证web server传递过来的数据是标准格式的&#xff0c;方便CGI程序的编写者。 web server&#xff08;如nginx&#xff09;是内容的分发者。 处理静态页面&#xff1a; 如果请求/index.html&#xff0c;web server就可以解…

Apache优化:修改最大并发连接数

http://www.365mini.com/page/apache-concurrency-configuration.htm Apache是一个跨平台的web服务器&#xff0c;由于其简单高效、稳定安全的特性&#xff0c;被广泛应用于计算机技术的各个领域。现在&#xff0c;Apache凭借其庞大的用户数&#xff0c;已成为用户数排名第一的…

黑马程序员___Java基础[02-Java基础语法](一)

Java语言基础组成 一、关键字 1)定义&#xff1a;被Java语言赋予了特殊含义的单词 2)特点&#xff1a;关键字中所有字母均为小写 3)作用及分类&#xff1a; 下面是Java语言保留专用的50个关键字&#xff1a; 用于定义数据类型的关键字&#xff08;12个&#xff09;&#xff1a;…

NSLog打印自定义对象

我们在开发中&#xff0c;如果直接使用NSLog打印对象&#xff0c;则会打印对象的指针&#xff08;如下图&#xff09; 但我们常常希望打印的是对象的属性的值&#xff0c;因此我们需要重写自定义类的description方法&#xff08;打印日志时&#xff0c;对象会收到description消…

数据库的安装与管理

数据库的安装与管理 1.mysql数据库的安装 yum install mariadb-server -y systemctl start mariadb ##开启数据库 netstat -antlupe | grep mysql ##查看端口 vim /etc/my.cnf ##修改配置文件。添加skip-networking1 systemctl restart mariadb ##重起服务 netstat -antlupe |…

SQL性能优化没有那么神秘

经常听说SQL Server最难的部分是性能优化&#xff0c;不禁让人感到优化这个工作很神秘&#xff0c;这种事情只有高手才能做。很早的时候我在网上看到一位高手写的博客&#xff0c;介绍了SQL优化的问题&#xff0c;从这些内容来看&#xff0c;优化并不都是一些很复杂的问题&…

腾讯云无法绑定公网IP问题解释与解决方案。

腾讯云无法绑定公网IP问题解释与解决方案。 http://blog.csdn.net/chenggong2dm/article/details/51475222 解释&#xff1a;公网IP并不直接配置在服务器上&#xff0c;而是在服务器外部的路由上&#xff0c;通过某种映射连接。 解决方案&#xff1a;绑定0.0.0.0 posted on 201…

iOS Category小举例

&#xff08;一&#xff09;Category作用&#xff1a;Category可以向已存在的类添加新的方法&#xff0c;或者覆盖原来类中已经存在的方法&#xff0c;从而扩展已有类&#xff08;在Java中为了实现类似功能&#xff0c;一般是创建子类&#xff09; &#xff08;二&#xff09;C…

memcache

nginxphpmemcache缓存 图解&#xff1a; [roottest5 ~]# /etc/init.d/iptables stop [roottest5 ~]# nginx [roottest5 ~]# /etc/init.d/php-fpm start Starting php-fpm done [roottest5 ~]# tar zxf memcache-2.2.5.tgz [roottest5 ~]# cd memcache-2.2.5 [roottest5…

iOS中KVO模式的解析与应用

最近老翁在项目中多处用到了KVO&#xff0c;深感这种模式的好处。现总结如下&#xff1a; 一、概述 KVO,即&#xff1a;Key-Value Observing&#xff0c;它提供一种机制&#xff0c;当指定的对象的属性被修改后&#xff0c;则对象就会接受到通知。简单的说就是每次指定的被观察…

C 到C++的升级

C所有的变量都可以在需要使用时再定义。 C语言中的变量都必须在作用域开始的位置定义。 register 关键字请求编译器将局部变量存储于寄存器中 在C语言无法获取register 变量的地址 在C中可以取得 register 变量的地址 C编译器有自己的优化方式&#xff0c;所以几乎不用registe…

SET QUOTED_IDENTIFIER OFF语句的作用

先看下面几个sql语句 1SETQUOTED_IDENTIFIER ON2SELECT*FROM"USER" WHEREanetasp34SETQUOTED_IDENTIFIER ON5SELECT*FROM[USER]WHEREanetasp67SETQUOTED_IDENTIFIER OFF8SELECT*FROM[USER]WHEREa"netasp" 910SETQUOTED_IDENTIFIER OFF11SELECT*FROM[USE…

proxy实现 mysql 读写分离

实现 mysql 读写分离 图解: 环境: iptables 和 selinux 关闭 proxy:test2 172.25.1.2 Master: test3 172.25.1.3 Slave:test4 172.25.1.4 环境已经实现 test3(master) 和 test4(slave) 的主从复制 Server2: [roottest2 ~]# ls mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz …

iOS开发中用到的一些第三方库

下面是我在开发中用到的一些优秀的iOS第三方开源库&#xff1a; 1.AFNetworking&#xff08;网络请求&#xff0c;类似的还有ASIHTTPRequest&#xff09; https://github.com/AFNetworking/AFNetworking/ 2.MBProgressHUD&#xff08;提示框&#xff09; https://github.…

小图标外链API

网页上有些分享的小图标&#xff0c;比如分享到facebook&#xff0c;weibo&#xff0c;qq空间等功能的时候&#xff0c;图标以前一般是自己做一个css sprite。当一个网站的图标变了的时候&#xff0c;比如facebook变成assbook的时候&#xff0c;你就要修改这个css sprite。费时…

转载JQuery 获取设置值,添加元素详解

转载原地址 http://www.cnblogs.com/0201zcr/p/4782476.html jQuery 获取内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分&#xff0c;就是操作 DOM 的能力。 jQuery 提供一系列与 DOM 相关的方法&#xff0c;这使访问和操作元素和属性变得很容易。 提示&#xff1a;DOM …

mysql 主从复制 和基于gtid的mysql主从复制

主从复制 原理: mysql 无需借助第三方工具,而是其自带的同步复制功能,另外一点,mysql 的主从 复制并不是从硬盘给上文件直接同步,而是逻辑的 binlog 日志同步到本地的应用执行的过 程。 数据从一个 mysql 数据库(master)复制到另一个 mysql 数据库(slave),在 master 与 slave …

使用read write 读写socket

一旦&#xff0c;我们建立好了tcp连接之后&#xff0c;我们就可以把得到的fd当作文件描述符来使用。 由此网络程序里最基本的函数就是read和write函数了。 写函数&#xff1a; ssize_t write(int fd, const void*buf,size_t nbytes); write函数将buf中的nbytes字节内容写入文件…

iOS从通讯录中选择联系人

有时候APP需要用户输入一位联系人的姓名和电话&#xff0c;除了用户手动输入&#xff0c;一般也允许用户从通讯录中选择一位联系人&#xff08;图1&#xff09;&#xff0c;下面的代码就是使用系统的<AddressBookUI/AddressBookUI.h>库实现这一需求。 图1 完整代码&…

document.readystate

http://www.cnblogs.com/lhb25/archive/2009/07/30/1535420.html http://www.cnblogs.com/haogj/archive/2013/01/15/2861950.html http://jincuodao.baijia.baidu.com/article/2896 电视转载于:https://www.cnblogs.com/daishuguang/p/3523783.html

Openstack安装部署

系统版本 rhel7.4 关闭 iptables 关闭 selinux foundation1: 172.25.254.1 server1: 172.25.254.11 server2: 172.25.254.12 可参考&#xff1a;https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/ //选择的mitaka 虚拟机上网 首先物理机必须可…

在Xcode中使用Git进行源码版本控制

本文翻译自Understanding Git Source Control in Xcode &#xff08;译者myShire&#xff09;欢迎您加入我们的翻译小组。 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本…

敏捷开发之道(二)极限编程XP

上次的博文敏捷开发之道&#xff08;一&#xff09;敏捷开发宣言中&#xff0c;我们介绍了一下敏捷开发宣言&#xff0c;在其中&#xff0c;我们了解到了关于敏捷开发的几个重要的价值观。今天我们来了解一个敏捷开发的方法——极限编程XP 1、介绍 极限编程&#xff08;eXtreme…

spring 3.X与jdk 1.8不兼容

1、报错&#xff08;部分&#xff09; 2、解决 虽然Spring的jdk要求如下&#xff0c;但是spring 3与jdk1.8不兼容&#xff08;使用的是spring 3.2&#xff09; 在eclipse将jdk版本下调。这里将JDK调到1.7&#xff08;在eclipse如下设置&#xff09; 同时&#xff0c;需要设置服…

rhel-server-7.5-x86_64-dvd.iso镜像下载及rar压缩包的解压

主机名为server1 [rootserver1 ~]# ls rhel-server-7.5-x86_64-dvd.part1.rar rarlinux-5.6.1.tar.gz rhel-server-7.5-x86_64-dvd.part2.rar 1、如果没有rarlinux-5.6.1.tar.gz包可以去 https://www.rarlab.com/download.htm 这个网站下载RAR 5.61 for Linux 或者RAR 5.…

Expandable Table的Demo

在网上看到一个可点击cell展开的TableView的demo&#xff0c;原文是swift语言&#xff0c;我写了个oc版&#xff0c;有兴趣的朋友可以看下&#xff1a; 效果&#xff1a; oc源码&#xff08;带中文注释&#xff09;&#xff1a;http://download.csdn.net/detail/dolacmeng/941…

Java对多线程的支持

Java运行时系统实现了一个用于调度线程执行的线程调度器&#xff0c;用于确定某一时刻由哪一个线程在CPU上运行。在Java技术中&#xff0c;线程通常是抢占式的而不需要时间片分配进程&#xff08;分配给每个线程相等的CPU时间的进程&#xff09;。抢占式调度模型就是许多线程处…

ESP8266-iot-2

1.SDK概述 复制相关的工程文件到HelloWorld里面 要在版本esp8266_nonos_sdk_v2.0.0_16_07_19上面开发&#xff0c;那么就要复制相应文件 然后打开IDE 导入HelloWorld到工程里面 创建3个文件&#xff0c;如下图 再从lib里面添加文件 复制到我的下面 复制app里面的内容 打算从IoT…

iptables防火墙策略

环境&#xff1a; foundation1 172.25.1.250 172.25.254.1 server1 172.25.1.1 server2 172.25.1.2 server3 172.25.1.3 四个主机都做解析 iptables简介&#xff1a; netfilter/iptables&#xff08;简称为iptables&#xf…