假设有两个字符串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); }
}

  如有不对欢迎指正!

使用KMP算法判断是否为旋转词的更多相关文章

  1. 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串

    我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...

  2. 判断字符串a和b是否互为旋转词

    旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...

  3. KMP算法浅析

    具体参见: KMP算法详解 背景: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除 ...

  4. 算法笔记之KMP算法

    本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...

  5. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  6. 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串

    1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...

  7. 用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成“***”就可 ...

  8. str_2.判断两个字符串是否互为旋转词

    1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...

  9. KMP算法解决字符串匹配问题

    要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...

随机推荐

  1. FPGrowth算法总结复习

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 关联规则(associatio rules):从大规模数据集中寻找物品建 ...

  2. [erl] erlang 进程注册和注销

    想要注册一个进程,必须先要创建一个进程. 如何创建一个进程,可以使用spawn.spawn_link,它们虽然都能创建进程,但是也有微妙的区别: 1)当前进程中创建一个并行进程,当被生成的进程崩溃时, ...

  3. 使用 DBCC IND 查看BTree 和 Heap结构

    Table 有两种结构:BTree 和 Heap,一个table的结构必定是其中之一.如果在表上创建clustered index,那么表的结构是BTree:如果表上没有创建Clustered ind ...

  4. react+redux教程(三)reduce()、filter()、map()、some()、every()、...展开属性

    reduce().filter().map().some().every()....展开属性   这些概念属于es5.es6中的语法,跟react+redux并没有什么联系,我们直接在https:// ...

  5. Linux笔记之——Linux关机命令详解(转)

    原文连接:http://www.jb51.net/os/RedHat/1334.html 在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重 ...

  6. PHP变量和数据类型

    编程语言可以分为三大类 1. 静态类型语言,比如:C/Java等,在静态语言类型中,类型的检查是在编译期(compile-time)确定的. 2. 动态语言类型,比如:PHP,python等各种脚本语 ...

  7. 简析GeoServer服务的内部文件组织以及GeoServer自动化服务发布工具的开发思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 通过GeoServer发布的服务,在GeoServer内部有 ...

  8. activity结束之后刷新之前的activity的内容

    点击添加按钮之后-----弹出一个新的activity--------在新的activity将数据输入保存之后,关闭当前的activity回到之前的activity刷新内容 实现:使用onActivi ...

  9. ajax代码及简单封装

    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); ...

  10. OpenCV2:等间隔采样和局部均值的图像缩小

    图像的缩小从物理意义上来说,就是将图像的每个像素的大小缩小相应的倍数.但是,改变像素的物理尺寸显然不是那么容易的,从数字图像处理的角度来看,图像的缩小实际就是通过减少像素个数来实现的.显而易见的,减少 ...