使用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的位置,如果不匹配, ...
随机推荐
- WCF 安全性 之 None
案例下载 http://download.csdn.net/detail/woxpp/4113172 服务端配置代码 <system.serviceModel> <services& ...
- C#设计模式系列:装饰模式(Decorator)
1. 装饰模式简介 装饰模式动态地给一个对象添加额外的职责.例如一幅画有没有画框都可以挂在墙上,画就是被装饰者.但是通常都是有画框的.在挂在墙上之前,画可以被蒙上玻璃,装到框子里,所以在画上加一层画框 ...
- Vue.js学习笔记(8)拖放
小颖在目前负责的项目中,负责给同事提供所需组件,在这期间,我们家大颖姐姐让我 写个拖拽组件,一开始我是用click实现,先将你要拖拽的dom点一下,然后再点你要放的位置,这个dom再通过小颖写的方法, ...
- 白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现
离去年“马尔可夫链进行彩票预测”已经一年了,同时我也计划了一个彩票数据框架的搭建,分析和预测的框架,会在今年逐步发表,拟定了一个目录,大家有什么样的意见和和问题,可以看看,留言我会在后面的文章中逐步改 ...
- 新作《ASP.NET MVC 5框架揭秘》正式出版
ASP.NET MVC是一个建立在ASP.NET平台上基于MVC模式的Web开发框架,它提供了一种与Web Form完全不同的开发方式.ASP.NET Web Form借鉴了Windows Form基 ...
- ASP.NET MVC之如何看待内置配置来提高性能优化(四)
前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...
- Objective-C中的Block回调模式
在前面的博客中提到了Block的概念和使用方法,个人感觉Block最爽的用法莫过于在回调时用block.感觉比委托回调和目标方法回调用着要顺手,好不好用还得读者亲自用一下才知道.如果 读者之前用过SS ...
- geotrellis使用(十三)数据导入BUG解决方案说明
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 BUG说明 解决方案 总结 一.前言 ...
- Microsoft.Office.Interop.Word 创建word
Microsoft.Office.Interop.Word 创建word 转载:http://www.cnblogs.com/chenbg2001/archive/2010/03/14/1685746 ...
- 如何做优化,UITabelView才能更加顺滑 (转载)
这篇文章是前两周@叶孤城叶大在微信群里面的分享,一直到这两天才翻出来研究.很多实用的东西,不过由于水平有限,有些地方没能翻译好,还请大家指正. 我已经在iOS这个最好的移动平台上有几年的开发经验了.在 ...