人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
AABCD CDAA ASD ASDF
yes no
可以用kmp来判断s1+s1是否包含s2
import java.util.Scanner; /** * https://www.nowcoder.com/questionTerminal/ca68cb11b1a94ddeb3181274d4e94760 */ public class Main { public static int[] getNextArr(char[] ch){ if (ch.length == 1){ return new int[] { -1 }; } int[] next = new int[ch.length]; next[0] = -1; next[1] = 0; int cn = 0; for (int i = 2; i < ch.length; i++) { if (ch[i-1] == ch[cn]){ next[i] = ++cn; }else if (cn > 0){ cn = next[cn]; }else { next[i] = 0; } } return next; } public static int judge(char[] ch1, char[] ch2, int[] next){ int l1 = 0; int l2 = 0; while(l1 < ch1.length && l2 < ch2.length){ if (ch1[l1] == ch2[l2]){ l1++; l2++; }else if(next[l2] == -1){ l1++; }else { l2 = next[l2]; } } return l2 == ch2.length ? l1 - l2 : -1; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { String str1 = sc.next(); String str2 = sc.next(); str1 = str1 + str1; if (str1.length() < str2.length()) { System.out.println("no"); } else { char[] ch1 = str1.toCharArray(); char[] ch2 = str2.toCharArray(); int[] next = getNextArr(ch2); int res = judge(ch1, ch2, next); if (res != -1) { System.out.println("yes"); } else { System.out.println("no"); } } } } }KMP实现