【每天一道算法题】Lucky String
2016-08-31 15:16
260 查看
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.[b]输入描述:[/b]
a string consisting no more than 100 lower case letters.[b]输出描述:[/b]
output the lucky substrings in lexicographical order.one per line. Same substrings should be printed once.[b]输入例子:[/b]
aabcd[b]输出例子:[/b]
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; }
相关文章推荐
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- 每天一道算法题——二叉树中和为某一值的路径
- 每天一道算法题3 求子数组的最大和
- 每天一道算法题9 字符串的排列
- 每天一道算法题(40)——组成的最小数字
- 【每天一道算法题】走迷宫
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 每天一道算法题——字符串匹配
- 每天一道算法题(五)Leetcode – Word Break (Java)
- 每天一道算法题--单链表的相关操作
- 每天一道算法_3_487-3279_对电话号码格式化统计批处理
- 每天一道算法题(36)——8皇后问题
- 每天一道算法题(1) ——不用乘除法求和1+2+…+n
- 校招准备系列:每天一道算法题(1)
- 【每天一道算法题】国王和囚犯
- 每天一道算法题——链表中倒数第k个结点
- 每天一道算法题(25)——字符串中连续出现次数最多的子串
- 每天一道算法题——字符串的排列
- 每天一道算法题(5)——求2个字符串的最长公共子序列和最长公共子字符串
- 每天一道算法题(16)——合并已排序的链表