首先理解题意:
如字符串aabbcde中,一共有abcde五种字母,而5是斐波那契数,因此这个子串可以被输出;
如字符串aabbcdef中,一共有abcdef六种字母,而6不是斐波那契数,因此这个子串不能被输出
那么接下来处理好逻辑就行了:
先生成给定字符串的所有子串,再分别对每一个子串统计其字母种类数,再判断是不是斐波那契数即可
注意unordered_set无序,而set自带排序,因此无需再排
#include <iostream> #include <set> #include <string> #include <unordered_set> using namespace std; int main() { string s; cin >> s; // 一共26种字母,因此记录26内的斐波那契数,便于查表 unordered_set<int> fibonacci = {1, 2, 3, 5, 8, 13, 21}; // 生成字符串s的所有子串 unordered_set<string> substrings; for (int i = 1; i <= s.size(); i++) { for (int j = 0; j < s.size() - i + 1; j++) { substrings.insert(s.substr(j, i)); } } unordered_set<char> kinds; // 存储子串字母的种类数 set<string> ans; for (const auto& substring : substrings) { kinds.clear(); // 注意每次判断一个新的子串要清空集合 // 将子串的各个字母插入到集合中去重 for (char ch : substring) { kinds.insert(ch); } // 判断这个数量是否是斐波那契数 if (fibonacci.find(kinds.size()) != fibonacci.end()) { ans.insert(substring); } } for (const auto& str : ans) { cout << str << endl; } return 0; }
时间复杂度:O(n^2),其中n是给定的字符串长度,主要用于生成子串
空间复杂度:O(n^2),其中n是给定的字符串长度,主要用于存储子串