书籍判断两个字符串是否互为旋转词

题目

如果一个字符串str,把字符串str前面任意的部分挪到后面形成的字符串叫作str的旋转词。比如str="12345",str的旋转词有"12345","23451","34512","45123"和"51234"。给定两个字符串a和b,请判断a和b是否互为旋转词。

举例

a="cdab",b="abcd" 返回true

a="1ab2",b="ab12" 返回false

a="2ab1",b="ab12" 返回true

如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回false。当a和b长度一样,都为N时,要求解法的时间复杂度为O(N).

如果a和b长度一样,先生成一个大字符串b2,b2是两个字符串b拼在一起的结果,即String b2 = b +b。

java 复制代码
public class KMP {

    public static boolean isRotation(String a, String b) {
        if(a == null || b == null || a.length() != b.length()){
            return false;
        }
        String b2 = b + b;
        return kmpSearch(b2, a) != -1;
    }

    public static int[] compteNext(String pattern) {
        int[] next = new int[pattern.length()];
        int j = 0;
        next[0] = j;
        for (int i = 1; i < pattern.length(); i++) {
            while (j > 0 && pattern.charAt(i)!= pattern.charAt(j)) {
                j = next[j - 1];
            }
            if (pattern.charAt(i) == pattern.charAt(j)) {
                j++;
            }
            next[i] = j;
        }
        return next;
    }

    public static int kmpSearch(String text, String pattern) {
        int[] next = compteNext(pattern);
        int i = 0, j = 0;
        while (i < text.length() && j < pattern.length()) {
            if (text.charAt(i) == pattern.charAt(j)) {
                i++;
                j++;
            } else if (j > 0) {
                j = next[j - 1];
            } else {
                i++;
            }
        }
        if (j == pattern.length()) {
            return i - j;
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        String text = "cdab";
        String pattern = "abcd";
        System.out.println("Pattern found at : " + isRotation(text, pattern));
    }
}
相关推荐
拾光Ծ8 分钟前
【C++高阶数据结构】红黑树
数据结构·算法
Kay_Liang14 分钟前
大语言模型如何精准调用函数—— Function Calling 系统笔记
java·大数据·spring boot·笔记·ai·langchain·tools
Qiuner16 分钟前
《掰开揉碎讲编程-长篇》重生之哈希表易如放掌
数据结构·算法·leetcode·力扣·哈希算法·哈希·一文读懂
艾莉丝努力练剑19 分钟前
【C++模版进阶】如何理解非类型模版参数、特化与分离编译?
linux·开发语言·数据结构·c++·stl
立志成为大牛的小牛30 分钟前
数据结构——二十五、邻接矩阵(王道408)
开发语言·数据结构·c++·学习·程序人生
自由的疯30 分钟前
Java 如何学习Docker
java·后端·架构
cici1587431 分钟前
基于MATLAB的ADS-B接收机卫星与接收天线初始化实现
算法·matlab
自由的疯32 分钟前
Java Docker本地部署
java·后端·架构
007php00733 分钟前
猿辅导Java面试真实经历与深度总结(二)
java·开发语言·python·计算机网络·面试·职场和发展·golang
摇滚侠36 分钟前
Spring Boot 3零基础教程,WEB 开发 内容协商机制 笔记34
java·spring boot·笔记·缓存