首页 > hihocoder 1152 Lucky Substrings

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 
 2 #include <string>
 3 #include 
 4 #include 
 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 
 2 #include <string>
 3 #include 
 4 #include 
 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

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...