题目描述
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
import java.util.*;
/**
* Created by ustc-lezg on 16/4/10.
*/
public class Main {
private static int[] fibo = {1,2,3,5,8,13,21,34,55,89};
private static boolean binarySearch(int x) {
int left = 0;
int right = 9;
int mid;
while (left <= right) {
mid = (left + right) >> 1;
if (fibo[mid] == x) {
return true;
} else if (fibo[mid] > x) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return false;
}
public static void main(String[] args) {
solve();
}
private static boolean check(String s) {
int cnt = 0;
boolean[] flag = new boolean[27];
for (int i = 0, len = s.length(); i < len; i++) {
if (!flag[s.charAt(i) - 'a']) {
flag[s.charAt(i)-'a'] = true;
++cnt;
}
}
return binarySearch(cnt);
}
private static void solve() {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String str = scanner.next();
String[] subStrs = new String[10002];
String s;
int count = 0;
for (int i = 0, len = str.length(); i < len; i++) {
for (int j = i + 1; j <= len; j++) {
s = str.substring(i, j);
if (check(s)) {
subStrs[count++] = s;
}
}
}
Arrays.sort(subStrs,0,count);
System.out.println(subStrs[0]);
for (int i = 1; i < count; ++i) {
if (!subStrs[i].equals(subStrs[i - 1])) {
System.out.println(subStrs[i]);
}
}
}
scanner.close();
}
}