【每天一道算法题】Lucky String

本文介绍了一种算法,用于找出给定字符串中所有幸运子串,并按字典序输出。幸运子串定义为其不同字符数量为斐波那契数。文章详细解释了如何通过构建子串、使用STL和数组标记等技术实现该算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int count(string s) {
    int p[26] = { 0 }, R = 0;
    for (int i = 0; i<s.length(); i++)
        if (p[s[i] - 'a'] == 0) {
            R++;
            p[s[i] - 'a'] = 1;
        }
    return R;
}
int main() {
    string str;
    set<string> s;
    cin >> str;
    const int fibonacci[] = { 1,2,3,5,8,13,21};
    vector<int> vec1(fibonacci, fibonacci + 7);

    int n = 1;
    while (n<str.length()) {
        for (int i = 0; i <= str.length() - n; i++) {
            string ss = str.substr(i, n);
            if (find(vec1.begin(), vec1.end(), count(ss)) != vec1.end())
                s.insert(ss);
        }
        n++;
    }
    set<string>::iterator it;
    for (it = s.begin(); it != s.end(); it++)
        cout << *it << endl;
    return 0;
}

 





















转载于:https://www.cnblogs.com/LUO77/p/5826027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值