如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。

  • 输入描述:

    • 输入包括n+1行:
    • 第一行为单词个数n(1 ≤ n ≤ 50)
    • 接下来的n行,每行一个单词word[i],长度length(1 ≤ length ≤ 50)。由小写字母构成
  • 输出描述:
    输出循环单词的种数

输入例子:

1
2
3
4
5
6
5
picture
turepic
icturep
word
ordw

输出例子:
2

Java解决方案:

  • 使用队列Queue LinkedList来获取一个单词对应的所有可能的循环单词
  • 使用Set来存储这些循环单词避免重复
  • 使用Set<Set<String>>来存储所有输入单词的循环单词,确保同一类的循环单词只存在一份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;

public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine());
String[] words = new String[n];
int i = 0;
while (i < n) {
words[i++] = scanner.nextLine();
}
scanner.close();
Set<Set<String>> sSets = new HashSet<>();
for (String string : words) {
sSets.add(getWords(string));
}
System.out.println(sSets.size());
}

static Set<String> getWords(String s) {
Set<String> set = new HashSet<>();
Queue<Character> characters = new LinkedList<>();
char[] cs = s.toCharArray();
for (char c : cs) {
characters.offer(c);
}
for (int i = 0; i < cs.length; i++) {
characters.poll();
characters.offer(cs[i]);
StringBuilder builder = new StringBuilder();
for (Character character : characters) {
builder.append(character);
}
set.add(builder.toString());
}
return set;
}

}