列表

详情


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

上一题