如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。
输入描述:
输入包括n+1行: 第一行为单词个数n(1 ≤ n ≤ 50) 接下来的n行,每行一个单词word[i],长度length(1 ≤ length ≤ 50)。由小写字母构成
输出描述:
输出循环单词的种数
输入例子:
5 picture turepic icturep word ordw
输出例子:
2
思路:主要为一个判断两个String是否是循环单词的函数,我的打算是(String a,String b),如果a.append(a)中包含b,且移除b部分之后还剩余一个a,则a与b是循环单词。而在判断一个数组内的循环单词数目时,则借助一个set或者list存储已经确定为循环单词的数组位置,只有容器中没有存储此循环单词的数组位置是,循环单词数目才增加,具体代码如下:
package basicTest;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Test2 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//System.out.println("输入单词个数N:");
int n = s.nextInt();
//System.out.println("输入各单词:");
String[] word = new String[n];
for(int i=0; i<word.length ; i++) {
word[i] = s.next();
}
//String[] word = {"goran","igor","domagoj","relia"};
System.out.println(findCount(word));
}
public static int findCount(String[] word) {
int countNum = 0;
Set<Integer> set = new HashSet<>();
for(int i=0; i<word.length; i++) {
for(int j= i ; j<word.length; j++) {
if( comparaR(word[j],word[i]) ){
if(set.contains(i) || set.contains(j)) {
set.add(i);
set.add(j);
} else {
set.add(i);
set.add(j);
countNum ++;
}
}
}
}
return countNum;
}
public static boolean comparaR(String a,String b) {
boolean isRound = false;
StringBuffer sb;
int index;
if(a.length() == b.length()) {
sb = new StringBuffer(a);
index = sb.append(a).indexOf(b);
if( index >=0 && sb.replace(index, index + a.length(), "").toString().equals(a)) {
isRound = true;
}
}
return isRound;
}
}