hihocoder #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中,如果不同的字符个数满足斐波那契数列也就是1,1,2,3,5,8……(注意是从1开始的)那么这个字符串就是lucky的。比如说字符串“afgagfds”它的不同的字符个数是5个,那么它就是lucky的;再比如“asdfa”不同的字符有4个,就不属于lucky。题目最后就要按照字典序输出一个字符串中所有的lucky子串。
  首先我计算了斐波那契数列,在BOOL数组对应位置置为true,其余的为false,用的时候就直接取对应的位置找是否在数列中。比方说,3在斐波那契数列中,则数组[3]=true,然后在实际判断中用if(数组[3])。我用了substr()函数截取子串

_Myt substr(size_type _Off = 0, size_type _Count = npos) const

  第一个参数是起始位置,第二个参数是截取的长度。截取好子串后,就用一个num数组来记录某个字符被访问过没,访问了就置true,初始值置为false。若对应的位置为true,就知道这个字符出现过,不用继续统计了。用count保存不同的字符个数。然后用if(数组[count]),判断count是否在斐波那契数列中。如果是就插入到set中,set是一个关联式容器,而且能按照字典序自动排序,也就是说,往set里面一塞就好,不用担心顺序问题了。最后输出set中的所有元素。下面是AC代码:
  

//#1152 : Lucky Substrings
#include<iostream>
#include<map>
#include<string.h>
#include<string>
#include<queue>
#include<vector>
#include <stdio.h>
#include<fstream>
#include<set>
#include<stdlib.h>
using namespace std;

#define Min(a,b) a<b?a:b
#define INF 1000000005
#define Num 100000+5
bool feibo[101];
set<string> jieguo;

int LuShi()
{
    string str;
    cin >> str;
    memset(feibo, false, sizeof(feibo));
    int a = 1, b = 1;
    while (b<101)//计算好斐波那契数列
    {
        feibo[b] = true;
        int c = a + b;
        a = b;
        b = c;
    }
    /*string tempStr = str.substr(2, 2);
    cout << tempStr << endl;*/
    for (int i = 0; i < str.length(); i++)//从字符串头开始
    {
        for (int j = 1; j < str.length()-i+1; j++)//每次截取的长度大于0,小于剩余的长度
        {
            bool num[30];
            int count = 0;
            memset(num, false, sizeof(num));
            string tempStr = str.substr(i, j);
            for (int k = 0; k < tempStr.length(); k++)
            {
                if (!num[tempStr[k] - 'a']) {//如果这个字符未被访问过
                    count++;//计数+1
                    num[tempStr[k] - 'a'] = true;//标记该字符已经被访问过
                }
            }
            if (feibo[count]) {//如果count属于斐波那契数列
                jieguo.insert(tempStr);
            }
        }
    }
    for (set<string>::iterator i = jieguo.begin(); i != jieguo.end(); i++)
    {
        cout << *i << endl;//由于set容器已经自动排序了,因此只用按照顺序输出就好
    }
    return 0;
}

int main()
{
    //Solution sol;
    //重定向,OJ时注意把它注释掉
    streambuf * oldbuf = cin.rdbuf((new ifstream("C:\\Users\\yzc\\Desktop\\input.txt"))->rdbuf());
    //cout << LuShi() << endl;
    LuShi();
    system("pause");
    //Fromfile.close();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值