1.题目原文
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s1 和 s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。例如CDAA
是由AABCD
两次移位后产生的新串BCDAA
的子串,而ABCD
与ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
一行,包含两个字符串,中间由单个空格隔开。字符串只包含字母和数字,长度不超过 30。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出"true"
,否则输出"false"
。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
AABCD CDAA
样例输出
true
2.题目分析及所用函数
2.1题目分析
根据题目可知,1.需要进行循环移位操作,因此可以写一个函数做循环移位,2.进行两个串之间的包含比较,判断二者哪一个比较长,让长的字符串进行移位操作,每次移位操作完成以后进行一次比较,如果有包含则输出“true”,直到最后一个如果依然没有包含关系则输出false
2.2所用函数
str1.contains(str2) 用于判断str1是否包含str2
str.length() 得到字符串的长度
str.toCharArray() 将str变为一个字符数组(这个方法的返回值是一个字符数组)
3.题解源代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str1 = scanner.next();
String str2 = scanner.next();
if(str1.length()==str2.length()) //如果长度相等直接输出false
System.out.println("false");
else if(str1.contains(str2)||str2.contains(str1)) //如果不用移位操作就有包含关系直接输出true
System.out.println("true");
else if(str1.length()>str2.length()) {
for (int i = 0; i < str1.length(); i++) {
str1 = move(str1);
if (str1.contains(str2)) {
System.out.println("true");
break;
}else if (i==str1.length()-1) {
System.out.println("false");
}
}
}
else {
for (int i = 0; i < str2.length(); i++) {
str2 = move(str2);
if (str2.contains(str1)) {
System.out.println("true");
break;
}else if (i==str2.length()-1) {
System.out.println("false");
}
}
}
}
public static String move(String str) { //函数用于串的移位操作
String ss = "";
char [] arr = str.toCharArray();
char temp = arr[arr.length-1];
for (int i = arr.length-1; i > 0; i--) {
arr[i]=arr[i-1];
}
arr[0]=temp;
for (int i = 0; i < arr.length; i++) {
ss += arr[i];
}
return ss;
}
}
如果这篇文章对您有用,点个赞吧,有什么疑问可以下方评论,我看到了都会回答。