博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断字符串a和b是否互为旋转词
阅读量:6608 次
发布时间:2019-06-24

本文共 1821 字,大约阅读时间需要 6 分钟。

 

旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词。

比如abc的旋转词有 abc,acb,cba,...

判断str1和str2是否互为旋转词,其最优解可以是时间复杂度为O(n)(n为字符串的长度)

方法如下:

1、判断长度是否相等

2、长度相等的话就构建大字符串,str1+str1(str1+str1中包含了str1的所有旋转词)

3、用KPM算法判断大字符串中是否包含str2

 

下面是具体算法实现,必须先了解KPM算法才行

package k;import java.util.Scanner;public class test1 {    static int[] next;  //next数组    static String str1; //字符串str1    static String str2; //字符串str2    static String str;  //字符串str=str1+str1    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        str1 = in.next(); //获取输入的第一个字符串        str2 = in.next(); //获取输入的第二个字符串        if (str1.length() != str2.length())  //如果长度不相等,那么就肯定不是互为旋转词            System.out.println(str1 + "与" + str2 + "不是互为旋转词");                else         {            str = str1 + str1;              makeNext(); //构建next数组              check(); //判断是否为旋转词        }    }    private static void check() {        int i = 0;        int j = 0;        while (i < str2.length() && j < str.length())             if (i == -1 || str2.charAt(i) == str.charAt(j)) {                i++;                j++;            } else {                i = next[i];            }            if (i >= str2.length())                System.out.println(str1 + "与" + str2 + "互为旋转词");            else                 System.out.println(str1 + "与" + str2 + "不是互为旋转词");    }    private static void makeNext() {        next = new int[str2.length()];        int i = 0;        int k = -1;        next[0] = -1;        while (i < str2.length() - 1) {            while (k >= 0 && str2.charAt(i) != str2.charAt(k))                k = next[k];            i++;            k++;            if (str2.charAt(i) == str2.charAt(k))                next[i] = next[k];            else                next[i] = k;        }    }}

 

转载于:https://www.cnblogs.com/tangZH/p/6655984.html

你可能感兴趣的文章
网卡绑定(服务器&&交换机),缓存服务器Squid架构配置
查看>>
web网站加速之CDN(Content Delivery Network)技术原理
查看>>
sed的基本用法
查看>>
一个不错的shell 脚本入门教程
查看>>
Ansible之playbook的使用
查看>>
ansible模块批量管理
查看>>
redis命令 - GET
查看>>
httpd.conf的基本设置
查看>>
RHEL/Centos7新功能
查看>>
DBA日常工作职责
查看>>
Redis的持久化
查看>>
linux安装NFS服务器学习
查看>>
Planner .NET日历日程控件能给你的应用程序提供多种日历日程功能
查看>>
我的友情链接
查看>>
Linux压力测试
查看>>
JAVA中的线程机制(二)
查看>>
nginx安装与配置2(转载)
查看>>
Linux下Mongodb安装和启动配置
查看>>
沈阳一饭店凌晨爆燃,燃气报警器时刻预防
查看>>
Redis 与 数据库处理数据的两种模式
查看>>