问题描述
旋转串指的是通过将一个字符串的开头字符依次移到结尾形成的新字符串。例如,字符串 "abc" 可以通过旋转变成 "bca" 和 "cab",他们之间互为旋转串。你的任务是判断在给定的字符串集合中,是否存在两个字符串互为旋转串。
测试样例
样例1:
输入:
n = 3, s = ["abb", "abc", "bab"]
输出:True
样例2:
输入:
n = 3, s = ["aba", "abc", "abb"]
输出:False
样例3:
输入:
n = 4, s = ["abc", "bca", "cab", "bac"]
输出:True
import java.util.ArrayList;
import java.util.List;
public class Main {
public static boolean solution(int n, String[] s) {
// write code here
int sLen=s.length,i,j;
int[] sLenArr=new int[sLen];
for(i=0;i<n;i++){
sLenArr[i]=s[i].length();
}
List<Integer> startPoint;
char head;
//拿第i个字符和第j个比较
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
//如果他们的长度都不相等,那么直接比较下一个
if(sLenArr[i]!=sLenArr[j]){
continue;
}
//如果相等
//比较的起点
head=s[i].charAt(0);
//找出第j个字符串和第i个字符一样的索引列表
startPoint=findStartIndexList(head,s[j]);
//
int pl= startPoint.size(),k;
for(k=0;k<pl;k++){
if(compare(s[i],s[j],startPoint.get(k))){
return true;
}
}
}
}
return false;
}
//找出和head一样的字符在s的索引
public static List<Integer> findStartIndexList(char head,String s){
List<Integer> startPoint=new ArrayList<>();
int i,len=s.length();
for( i=0;i<len;i++){
if(s.charAt(i)==head){
startPoint.add(i);
}
}
return startPoint;
}
//循环比较的操作,si的开头和sj第index个开始比较
public static boolean compare(String si,String sj,int index){
int i,len=si.length(),j;
for(i=0;i<len;i++){
j=(i+index)%len;
if(si.charAt(i)!=sj.charAt(j)){
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(solution(3, new String[]{"abb", "abc", "bab"}) == true);
System.out.println(solution(3, new String[]{"aba", "abc", "abb"}) == false);
System.out.println(solution(4, new String[]{"abc", "bca", "cab", "bac"}) == true);
}
}