使用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);
    }
}
如有不对欢迎指正!
使用KMP算法判断是否为旋转词的更多相关文章
- 算法之暴力破解和kmp算法 判断A字符串是否包含B字符串
		
我们都知道java中有封装好的方法,用来比较A字符串是否包含B字符串 如下代码,contains,用法是 str1.contains(str2), 这个布尔型返回,存在返回true,不存在返回fals ...
 - 判断字符串a和b是否互为旋转词
		
旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...
 - KMP算法浅析
		
具体参见: KMP算法详解 背景: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除 ...
 - 算法笔记之KMP算法
		
本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...
 - 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
		
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
 - 算法进阶面试题01——KMP算法详解、输出含两次原子串的最短串、判断T1是否包含T2子树、Manacher算法详解、使字符串成为最短回文串
		
1.KMP算法详解与应用 子序列:可以连续可以不连续. 子数组/串:要连续 暴力方法:逐个位置比对. KMP:让前面的,指导后面. 概念建设: d的最长前缀与最长后缀的匹配长度为3.(前缀不能到最后一 ...
 - 用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
		
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成“***”就可 ...
 - str_2.判断两个字符串是否互为旋转词
		
1. 字符串str的前面任意部分挪到后面形成的字符串叫做字符串str的旋转词 $str1 = "2ab1"; $str2 = "ab12"; $ret = is ...
 - KMP算法解决字符串匹配问题
		
要解决的问题 假设字符串str长度为N,字符串match长度为M,M <= N, 想确定str中是否有某个子串是等于match的.返回和match匹配的字符串的首字母在str的位置,如果不匹配, ...
 
随机推荐
- 总体介绍ASP.NET Web API下Controller的激活与释放流程
			
通过<ASP.NET Web API的Controller是如何被创建的?>我们已经对HttpController激活系统的核心对象有了深刻的了解,这些对象包括用于解析程序集和有效Http ...
 - C语言  ·  动态数组的使用
			
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 5 3 4 0 0 2样例输出:9 1样 ...
 - 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法
			
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7 在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...
 - JavaScript算法(冒泡排序、选择排序与插入排序)
			
冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...
 - iOS创建安全的单例
			
创建安全的单例 #import "Singleton.h" @implementation Singleton static Singleton* _instance = nil; ...
 - WebDriver--简单的元素操作
			
以登录163邮箱为例,演示以下几个方法的使用 ①switch_to.frame() ②.clear() ③.send_keys() ④.click() ⑤switch_to_default_conte ...
 - Spring学习记录(十一)---使用注解和自动装配
			
Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入c ...
 - 网站初步收工---www.dkill.net
			
今天10.30左右备案核审成功了,然后一天都在忙部署和一些其他的东西,中途也写了很多文档,遇到很多问题,直接琢磨了N久,暂时发了这么多教程,明天揭露阿里云的各种坑(先用winServer服务器,有时间 ...
 - OpenCascade B-Spline Basis Function
			
OpenCascade B-Spline Basis Function eryar@163.com Abstract. B-splines are quite a bit more flexible ...
 - 前端学PHP之运算符
			
× 目录 [1]总括 [2]算术运算符 [3]赋值运算符[4]位运算符[5]比较运算符[6]错误控制[7]逻辑运算符[8]字符串连接[9]数组运算符 前面的话 运算符是可以通过给出的一或多个表达式来产 ...