#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[] = 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)

这里我们把alphabetcount从函数中抽取出来,作为了全局变量。同时,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的更多相关文章

  1. hihocoder #1152 Lucky Substrings 【字符串处理问题】strsub()函数+set集合去重

    #1152 : Lucky Substrings时间限制:10000ms单点时限:1000ms内存限制:256MB描述A string s is LUCKY if and only if the nu ...

  2. 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if the number of different ch ...

  3. Lucky Substrings

    而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...

  4. Lucky String

    Lucky String -- 微软笔试 标签(空格分隔): 算法 A string s is LUCKY if and only if the number of different charact ...

  5. 【每天一道算法题】Lucky String

    A string s is LUCKY if and only if the number of different characters in s is a fibonacci number. Gi ...

  6. hihoCoder 1426 : What a Ridiculous Election(总统夶选)

    hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...

  7. hihoCoder 1432 : JiLi Number(吉利数)

    hihoCoder #1432 : JiLi Number(吉利数) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 Driver Ji l ...

  8. lucky 的 时光助理(2)

    lucky小姐说:昨天晚上他喝醉了,发消息说他想我了,说他后悔了. 我很惊讶. 我问lucky:你们很久都没有联系, 突然说... 你怎么想. 没错,'他'就是lucky的前男友. lucky看着我, ...

  9. lucky 的 时光助理

    2017年的lucky小姐,厌倦了现在的工作,她觉得这些的工作对于她而言不具备挑战性,她在迷茫春节过后该如何选择, 这里是距她走出校门整整一年的时光. lucky小姐从开发走向了实施,目的是想周游这个 ...

随机推荐

  1. 使用Vagrant在Windows下部署开发环境

    做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各麻烦的问题是实际部署的环境通常是Linux ...

  2. HTML第五天学习笔记

    今天先是学习了基础的css样式 <html> <head> <title></title> <meta http-equiv = "co ...

  3. MFC中关于子对话框中编辑框不能编辑的问题

    最近在用MFC写程序.发现子对话框中的编辑框不能编辑.具体问题是这样的: 我有一个对话框YhglDlg,创建了这个对话框的子对话框ZjyhxxDlg,子对话框的Style属性为Child,Border ...

  4. Java面试试题

    第一,谈谈final, finally, finalize的区别.最常被问到. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以impl ...

  5. 怎样对ListView的项进行排序

    当您使用资源浏览器查看文件时,您能够随心所欲的按名称.大小.类型及改动日期不同的列对文件进行大小排序..Net提供的ListView组件没有直接提供这样的功能,但要实现并不难.   ListView. ...

  6. MiinCMP1.0 SAE 新浪云版公布, 开源企业站点系统

    MiinCMP是一款开源企业站点系统,除可执行于256M左右100元的国内IDC外,JUULUU聚龙软件团队最近开发了面向新浪云的版本号,该版本号可将站点免费布署到新浪云SAE上.MiinCMP採用j ...

  7. Codeforces Round #309 (Div. 2) B. Ohana Cleans Up 字符串水题

    B. Ohana Cleans Up Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/554/pr ...

  8. oc-28-构造函数

    Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { NSString *_name; int _age; ...

  9. 疑难杂症:java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion(Ljava/lang/String;)V

    错误: java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion(Ljava/lang/Strin ...

  10. javascript typeof 和 constructor比较

    转自:http://www.cnblogs.com/hacker84/archive/2009/04/22/1441500.html http://www.cnblogs.com/siceblue/a ...