This page looks best with JavaScript enabled

循环单词问题

 ·  ☕ 1 min read

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

  • 输入描述:

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

输入例子:

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;
	}

}
Support the author with
alipay QR Code
wechat QR Code

Yang
WRITTEN BY
Yang
Developer