0
点赞
收藏
分享

微信扫一扫

模拟算法题目

就是耍帅 2022-02-05 阅读 33
算法模拟

模拟算法题目


旋转词

在这里插入图片描述

在这里插入图片描述

题目解析: KMP算法应用


import java.util.Scanner;

//模拟-旋转词
public class Main {
	public static class KMP{
		public String s1;
		public String s2;//目标串
		public int next[];
		public KMP(String s1,String s2) {
			this.s1=s1;
			this.s2=s2;
			if(s2.length()>0)next=new int[s2.length()];
		}
		public void getNextArray() {
			if(s2.length()==1) {
				next[0]=-1;
				return;
			}
			next[0]=-1;
			next[1]=0;
			int i=2;
			int cn=0;//从0开始与s2[i-1]比对
			while(i<s2.length()) {
				if(s2.charAt(next[i-1])==s2.charAt(cn)) {
					next[i++]=++cn;
				}else if(cn>0) {
					cn=next[cn];
				}else {//cn<=0
					++i;
				}
			}
		}
		public int getIndexOf() {
			if(s2.length()>s1.length()) {
				return -1;
			}
			getNextArray();
			int x=0;
			int y=0;
			while(x<s1.length()&&y<s2.length()) {
				if(s1.charAt(x)==s2.charAt(y)) {
					x++;
					y++;
				}
				else if(next[y]==-1) {
					x++;
				}else {
					y=next[y];
				}
			}
			return y==s2.length()?x-y:-1;
		}
	}
	public static boolean isRotateWord(String s1,String s2) {
		if(s1.length()!=s2.length())return false;
		s1+=s1;
		//KMP判断s2是否是s1的字串
		KMP kmp=new KMP(s1,s2);
		return kmp.getIndexOf()!=-1?true:false;
		
		
	}
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int n,m;
		n=scan.nextInt();
		m=scan.nextInt();
		scan.nextLine();
		String s1,s2;
		s1=scan.nextLine();
		s2=scan.nextLine();
		boolean ans=isRotateWord(s1,s2);
		if(ans)System.out.println("YES");
		else System.out.println("NO");
		
	}

}



举报

相关推荐

0 条评论