使用KMP算法判断是否为旋转词

  假设有两个字符串A、B,要判断它们是否为旋转词,只需构造一个“A+A”字符串,再与B比较,若B为A的旋转词,则使用KMP算法是可以得到结果的

  代码如下:

import java.util.*;

public class test {

    public static boolean chkRotation(String A,  String B) {
if(A.length()!=B.length()) return false;
String buf =new String(A+A);
int flag;
flag=kmp(buf,B);
if(flag==-1) return false;
else return true;
}
/* public static void getNext(String str ){
int[] next=new int[str.length()];
next[0]=-1;
char[] chars=str.toCharArray();
int i=0;
int j=-1;在java里面不能这么写 //"前缀"指除了最后一个字符以外,一个字符串的全部头部组合;
//"后缀"指除了第一个字符以外,一个字符串的全部尾部组合。 while(i<str.length()){
if(j==-1||chars[i]==chars[j]){//此处的数组越界,报错
i++;
j++;
next[i]=j;
} else
next[j]=j;
} }
*/
public static int[] getNext(String str){
if(str.length()==-1) return new int[] {-1};
char[] chars=str.toCharArray();
int[] next=new int[str.length()];
next[0]=-1;
next[1]=0;
int pos=2;
int cn=0;
while (pos<str.length()){
if (chars[pos-1]==chars[cn]){
next[pos++]=++cn;
}
else if(cn>0) cn=next[cn];
else next[pos++]=0;
}
return next;
} /*public static int kmp(String str, String pattern){
int i,j;
i=0;
j=0;
char[] chars=str.toCharArray();
int[] next=getNext(str);
while(i<str.length())
{
if(j==-1||chars[i]==chars[j])
{
i++;
j++;
}
else
{
j=next[j]; //消除了指针i的回溯
}
if(j==pattern.length())
return i-pattern.length();
}
return -1;
}
*/
public static int kmp(String ss,String ps){
if (ss.length()==0||ps.length()==0) return -1;
char[] chars=ss.toCharArray();
char[] charp=ps.toCharArray();
int i=0;//ss的指针
int j=0;//ps的指针
int[] next=getNext(ps);//这里相当于String B
while (i<ss.length()&&j<ps.length()){
if (j==-1||chars[i]==charp[j]){
i++;
j++;
}
else j=next[j];
}
if (j==ps.length()) return i-j;
else return -1;
}
public static int BFMatch(String str,String pattern){
char[] chars=str.toCharArray();
char[] charp=pattern.toCharArray();
/* int i=0; */
int charsi=0;
int charpi=0;
while(charsi<str.length()){
while(chars[charsi]==charp[charpi]){
charsi++;
charpi++;
}
if(charpi==str.length()-1)
return charsi-str.length();//找到匹配字符串中的匹配起始位置
charsi=charsi-charpi+1;
}
return -1;
}
public static void main(String[] args){
String str="RFSPUYLYR";
String pattern="UYLYRRFSP";
boolean f=chkRotation(str,pattern);
System.out.println(f);
System.exit(0); }
}

  如有不对欢迎指正!

上一篇:[Catalan数三连]网格&有趣的数列&树屋阶梯


下一篇:css笔记17:盒子模型加强版的案例