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小姐从开发走向了实施,目的是想周游这个 ...
随机推荐
- until与till的用法归纳
until与till的用法归纳 崔荣斌 until和till两者都可作介词.连词,一般情况下可以互换使用.用于肯定句时,主句的动词只用延续性的,它所表示的动作一直延续到till或until表示的时间为 ...
- MON166 User's Guide
MON166 is a debug monitor for C16x and ST10 user programs. It consists of: A configurable monitor pr ...
- UIImage imageNamed 与 imageWithContentsOfFile的差别
[UIImage imageNamed:]仅仅适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用 用UIImage载入本地图像最经常使用的是以下三种: 1.用imageNamed方法 [UI ...
- [转]iOS应用性能调优的25个建议和技巧
写在前面 本文来自iOS Tutorial Team 的 Marcelo Fabri,他是Movile的一名 iOS 程序员.这是他的个人网站:http://www.marcelofabri.com/ ...
- jQuery分别获取选中的复选框值
function jqchk(){ //jquery获取复选框值 var s=''; $('input[name="aihao"]:checked').each(func ...
- git常见问题
一.设置git的user name和email: git config --global user.name "lei.li" git config --global user.e ...
- [Angular2 Router] Lazy Load Angular 2 Modules with the Router
Angular 2 lazy loading is a core feature of Angular 2. Lazy loading allows your application to start ...
- iOS CocoaPods安装和使用图解
Cocoapods安装步骤 1.升级Ruby环境 sudo gem update --system 如果Ruby没有安装,请参考 如何在Mac OS X上安装 Ruby运行环境 2.安装CocoaPo ...
- iOS 2D绘图详解(Quartz 2D)之Bitmap
什么是Bitmap? Bitmap叫做位图,每一个像素点由1-32bit组成.每个像素点包括多个颜色组件和一个Alpha组件(例如:RGBA). iOS中指出如下格式的图片 JPEG, GIF, PN ...
- oracle db打one-off-patch 一例
由于EBS form界面有一个报错,是一个小bug,以下打一个小patch修补一下. [以下的过程没有停库] 解压p8496830_111070_Linux-x86-64.zip cd 8496830 ...