Lucky String

来源:互联网 发布:国际网络电话机 编辑:程序博客网 时间:2024/06/11 02:28

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

微软的题目。
字符串处理,主要是找到子串,然后判断子串里不同的字符数。主要由三个难点:

1、判断子串里不同字符个数,可以用一个大小为26char数组来解决:如果出现过就置1,如果没有出现过就是默认的0.(用count函数解决)

2、主要就是要生成全部的substring,以及26以内的fibonacci数列。
26以内的fibonacci数列只有 1 2 3 5 8 13 21 34 55 89,用一个const int数组可以表示。然后用STL里的find函数来判断是否为fibonacci数列。

3、构建子串,用STL里的string的substr(int i,size_t size)可以解决。

#include<iostream>#include<vector>#include<set>#include<string>using namespace std;int count(string &s){    int num[26] = { 0 };    int R=0;    for (int i = 0; i < s.length();i++)        if (num[s[i] - 'a'] == 0)        {            R++;            num[s[i] - 'a'] = 1;        }    return R++;}set<string> GetSubString(string &str){    string ss;    set<string> substr;    const int fib[] = { 1, 2, 3, 5, 8, 13, 21 };    vector<int> vec(fib, fib + 7);    //子字符串的大小n;    for (int n = 1; n <=str.length(); n++)    {        //i最大只能取到str.length()-n        for (int i = 0; i <=str.length()-n; i++)        {            ss = str.substr(i, n);            if (find(vec.begin(), vec.end(), count(ss)) != vec.end())            {                substr.insert(ss);            }        }    }    return substr;}
原创粉丝点击