hihocoder 1152 Lucky Substrings
#1152 : Lucky Substrings
描述
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[] = false
count = 0
For c in subString
If not alphabet[c] Then
alphabet[c] = true
count = count + 1
End If
End For
Return (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] Then
alphabet[c] = true
count = count + 1
End If
Return (count is Fibonaccid number)
这里我们把
alphabet和count从函数中抽取出来,作为了全局变量。同时,isLucky的参数变为单个字符,每次将新增的S[j+1]加入统计中。下面是函数的主体部分:
For i = 0 .. len - 1
alphabet[] = false
count = 0
For j = i .. len - 1
// 此时isLucky返回的是S[i..j]的不同字母数量是否满足条件
If isLucky(S[j]) Then
ansList.push(S[i..j])
End If
End For
End For
最后只需要将
ansList所保存的子串进行排序去重后输出,即可顺利通过该题目。#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <set>
using namespace std;
string s; bool IsFibonaccidNum(int n){
return (n == || n == || n == || n == || n == || n == || n == );
} bool isLucky(int i, int j){
int alphabet[] = {};
//memset(alphabet, 0, sizeof(alphabet));
int count = ;
for(int k = i; k <= j; k++){
if(alphabet[s[k] - 'a'] == ){
alphabet[s[k] - 'a'] = ;
count++;
}
}
return (IsFibonaccidNum(count));
} int main(){
set<string> set1;
cin >> s;
int len = s.length();
for(int i = ; i < len; i++){
for(int j = i; j < len; j++){
if(isLucky(i, j)){
string str = s.substr(i, j - i + );
set1.insert(str);
}
}
} for(set<string>::iterator it = set1.begin(); it != set1.end(); it++){
cout << *it << endl;
}
//system("pause");
return ;
}#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <set>
using namespace std;
int alphabet[] = {}, cnt; bool IsFibonaccidNum(int n){
return (n == || n == || n == || n == || n == || n == || n == );
} bool isLucky(char c){
if(alphabet[c - 'a'] == ){
alphabet[c - 'a'] = ;
cnt++;
}
return (IsFibonaccidNum(cnt));
} int main(){
set<string> set1;
string s;
cin >> s;
int len = s.length();
for(int i = ; i < len; i++){
memset(alphabet, , sizeof(alphabet));
cnt = ;
for(int j = i; j < len; j++){
if(isLucky(s[j])){
string str = s.substr(i, j - i + );
set1.insert(str);
}
}
} for(set<string>::iterator it = set1.begin(); it != set1.end(); it++){
cout << *it << endl;
}
//system("pause");
return ;
}
hihocoder 1152 Lucky Substrings的更多相关文章
- hihocoder #1152 Lucky Substrings 【字符串处理问题】strsub()函数+set集合去重
#1152 : Lucky Substrings时间限制:10000ms单点时限:1000ms内存限制:256MB描述A string s is LUCKY if and only if the nu ...
- 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if the number of different ch ...
- Lucky Substrings
而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...
- Lucky String
Lucky String -- 微软笔试 标签(空格分隔): 算法 A string s is LUCKY if and only if the number of different charact ...
- 【每天一道算法题】Lucky String
A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Gi ...
- hihoCoder 1426 : What a Ridiculous Election(总统夶选)
hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...
- hihoCoder 1432 : JiLi Number(吉利数)
hihoCoder #1432 : JiLi Number(吉利数) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 Driver Ji l ...
- lucky 的 时光助理(2)
lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...
- lucky 的 时光助理
2017年的lucky小姐,厌倦了现在的工作,她觉得这些的工作对于她而言不具备挑战性,她在迷茫春节过后该如何选择, 这里是距她走出校门整整一年的时光. lucky小姐从开发走向了实施,目的是想周游这个 ...
随机推荐
- Spring AOP 实现原理
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入 ...
- [前端引用] 利用ajax实现类似php include require 等命令的功能
利用ajax实现类似php中的include.require等命令的功能 最新文件下载: https://github.com/myfancy/ajaxInclude 建议去这里阅读readme-2. ...
- Flex坐标
flash和flex针对不同的目的,提供了3种不同的坐标系. 全局的就是(stage级别的) 本地坐标系(组件级别的) 内容坐标系(相对于本地坐标系说的) 这些坐标系的点是可以转换的,并且有相应的方法 ...
- MySQL通配符过滤
在WHERE后使用LIKE操作符能够进行通配符过滤: products表例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1eWluZ18xM ...
- hadoop分布式部署(2014-3-8)
hadoop简介: (维基百科)Apache Hadoop是一款支持數據密集型分佈式應用并以Apache 2.0許可協議發佈的開源軟體框架.它支持在商品硬件構建的大型集群上運行的應用程序.Hadoop ...
- VK Cup 2012 Qualification Round 1 C. Cd and pwd commands 模拟
C. Cd and pwd commands Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- 全面整理的C++面试题
C++面试题 1.是不是一个父类写了一个virtual 函数,假设子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的. private 也被集成,仅仅事派生类没有 ...
- 如何利用PhoneGap制作地图APP
摘要:百度地图API是一套由javascript编写的地图程序接口,按说它应该运行在浏览器上.现在,只要利用PhoneGap,我们就能开发出移动平台上能使用的APP了! --------------- ...
- .net处理JSON简明教程
.net处理JSON简明教程 Json.Net是.net中的一种流行的高性能的JSON框架. 特点 灵活的JSON序列化转化.net对象为JSON字符串.和把JSON字符串转换为.net对象. 手动读 ...
- 浅谈模块化的JavaScript
模块化JavaScript之风早已席卷而来, CommonJS . AMD . NodeJS .RequireJS . SeaJS . curljs 等模块化的JavaScript概念及库扑面而来, ...