NC14587. 莫比乌斯串
描述
有天糖在学算法的时候,看到一种有意思的字符串,叫做“莫比乌斯串”, 这个串的特点是: 把从字符串的某一个位置把字符串截断, 并把前面的串放到后面构成新的串。比如有个串“asdasdf”, 它可以从‘d’那里截断,构成新串“asdfasd”,
现在你的任务是:判断给定的两个串是否为“莫比乌斯串”。
输入描述
有多组测试数据,每组测试数据有两个字符串, 长度N<=1000
输出描述
对于每一组数据,输出一行,如果两者能构成“莫比乌斯串”则输出“Yes”, 否则输出“No”。
示例1
输入:
1 asdasdf asdfasd
输出:
Yes
C(clang 3.9) 解法, 执行用时: 15ms, 内存消耗: 1384K, 提交时间: 2020-06-18 21:32:10
#include<stdio.h> #include<string.h> typedef short int sh; sh next[2222]; char S[2222],S2[1111],T[1111]; void Getnext(); void KMP(); int main() { int t,l; scanf("%d",&t); while(t--) { scanf("%s%s",S2,T); l=strlen(S2); strcpy(S,S2); strcpy(S+l,S2); Getnext(); KMP(); } return 0; } void KMP() { int i; for(i=0;S[i];i++) { int j=0; while(j!=-1&&S[i]&&T[j]) { if(S[i]==T[j]) { j++; i++; } else { j=next[j]; } } if(j>=0&&!T[j]) { puts("Yes"); return; } } puts("No"); } void Getnext() { next[0]=-1; int i; for(i=1;T[i];i++) { int j=next[i-1]; while(j!=-1&&T[j]!=T[i-1]) j=next[j]; next[i]=j+1; } }
Java(javac 1.8) 解法, 执行用时: 731ms, 内存消耗: 79608K, 提交时间: 2017-12-10 14:35:01
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int t = in.nextInt(); while (t-- > 0) { String s1 = in.next(); String s2 = in.next(); System.out.println((s1.length() == s2.length() && (test(s1, s2))) ? "Yes" : "No"); } } static boolean test(String s1, String s2) { int n2 = s2.length() - 1; while (n2 >= 0) { if (s1.startsWith(s2.substring(n2)) && s1.endsWith(s2.substring(0, n2))) return true; n2--; } return false; } }
C++11(clang++ 3.9) 解法, 执行用时: 40ms, 内存消耗: 384K, 提交时间: 2017-12-10 10:42:56
# include <stdio.h> #include <string.h> int m(char x[],char y[]) { char c[1000]; int i,k,m=strlen(x)-1; for(i=1;i<m;i++) { k=m; while(k) { c[k]='\0'; k--; } strcpy(c,&x[i]); strcat(c,x); c[m+1]='\0'; if(strcmp(c,y)==0) return 1; } return 0; } int main() { int t; char a[1000], b[1000]; scanf("%d",&t); while(t) { scanf("%s %s",a,b); if(m(a,b)) printf("Yes\n"); else printf("No\n"); t--; } }
Python3 解法, 执行用时: 73ms, 内存消耗: 4596K, 提交时间: 2022-11-25 10:41:58
n=int(input()) while(n>0): s=input().split(); length=len(s[0]) s[0]+=s[0]; if length==len(s[1]) and s[1] in s[0]: print("Yes") else: print("No") n-=1