题目:
如果一个字符串 str,把字符串 str 前面任意的部分挪到后面形成的字符串叫做 str 的旋转词。给定两个字符串 a 和 b,请判断 a 和 b 是否互为旋转词
举例:
a = “cdab”,b = “abcd”,返回 true
a = “1ab2”,b = “ab12”,返回 false
a = “2ab1”,b = “ab12”,返回 true
要求:
当 a 和 b 长度一样,都为 N 时,要求时间复杂度为 O(N)
思路:
- 如果其中任意一个字符串为空或者两个字符串长度不相等,则不是旋转词
- 由题目描述可以知道,旋转词是将 str 前面任意部分挪到后面形成的字符串叫做 str 的旋转词,所以,可以在 str 后面直接拼接 str 字符串,这样,str 的旋转词都在拼接后的字符串里边。对于本题,可以先在 b 后边拼接 b,这样新字符串 str 就有了 b 的所有旋转词,如果在 str 中找到了 a,说明 a 和 b 互为旋转词,如果没找到,返回 false
import java.util.Scanner;
public class Solution {
//第一种方法
public static boolean isRotation(String a,String b){
if(a==null||b==null||a.length()!=b.length()){
return false;
}
//String str = b + b;
//在 str 中找 a
//能找到,返回 true,找不到,返回 false
String str = b + b;
//str.length()/2就是a.length()
for(int i = 0;i < str.length()/2+1;i++){
String s = str.substring(i,i+(str.length()/2));
if(s.equals(a)){
return true;
}
}
return false;
}
//第二种方法
public static boolean isRotation2(String a,String b){
if(a==null||b==null||a.length()!=b.length()){
return false;
}
String str = b + b;
return str.contains(a);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
String b = sc.nextLine();
System.out.println(isRotation(a,b));
}
}