题目描述
如果一个字符串为str,把字符串的前面任意部分挪到后面形成的字符串交str的旋转词。比如str=“12345”,str的旋转串有“12345”、“45123”等等。给定两个字符串,判断是否为旋转词。
输入描述:
输出包含三行,第一个两个整数n和m(1≤n,m≤105)(1 \leq n,m \leq10^5 )(1≤n,m≤105),分别表示两个字符串的长度。第二行和第三行各输入一个字符串。
输出描述:
如果两个字符串互为旋转词请输出“YES”,否则输出“NO”。
示例1
输入
4 4
abcd
cdab
输出
YES
示例2
输入
2 3
aa
aaa
输出
NO
解法一:截取字符串对比
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] lens = br.readLine().trim().split(" ");
int l1 = Integer.parseInt(lens[0]);
int l2 = Integer.parseInt(lens[1]);
String s1 = br.readLine();
String s2 = br.readLine();
if(l1!=l2){
System.out.println("NO");
return ;
}
isReverse(s1,s2);
}
public static void isReverse(String s1,String s2){
for(int i=0;i<s1.length();i++){
if(s2.charAt(i)==s1.charAt(0)){
String s2r = s2.substring(i);
String s2l = s2.substring(0,i);
String s1l = s1.substring(0,s1.length()-i);
String s1r = s1.substring(s1.length()-i);
if(s2r.equals(s1l)&&s2l.equals(s1r)){
System.out.println("YES");
return;
}
}
}
System.out.println("NO");
}
}
解法二:字符串拼接+KMP匹配
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args)throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] lens = br.readLine().trim().split(" ");
int l1 = Integer.parseInt(lens[0]);
int l2 = Integer.parseInt(lens[1]);
String s1 = br.readLine();
String s2 = br.readLine();
if(l1!=l2){
System.out.println("NO");
return ;
}
isReverse(s1,s2);
}
public static void isReverse(String s1,String s2){
String s = s2+s2;
if(s.indexOf(s1)!=-1){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}