旋转字符串

题目描述

给字符串定义一个“旋转“的操作,比如字符串AbcD旋转一次变成bcDA。继续旋转则依次变成cDAb、DAbc、Abcd。 给定两个字符串“源和目标”请判断“源“在旋转一定次数后,是否可以包含“目标

输入描述

三组长度非空字符串,一共6行,奇数行为“源“字符串,偶数行为“目标”字符串

输出描述

每组字符串是否可以旋转包含。包含返回 1, 不包含返回 0

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

AABCD
CDAA
AABCD
ABCD
AABCD
CFS

输出

110

代码待验证

function getPrefix(pattern, prefix){
    let i = 1;
    let len = 0;
    prefix[0] = 0;
    while(i<pattern.length){
        if(pattern[i] == pattern[len]){
            prefix[i++] = ++len;
        }else{
            if(len>0){
                len = prefix[len-1];
            }else{
                prefix[i++] = len;
            }
        }
    }
}
function kmpSearch(text, pattern){
    let prefix = [];
    getPrefix(pattern, prefix);
    prefix.unshift(-1);
    prefix.pop();
    let i = 0;
    let j = 0;
    while(i<text.length){
        if(text[i] == pattern[j] && j == pattern.length - 1){
            return i-j;
        }
        else if(text[i] == pattern[j]){
            i++;
            j++;
        }else{
            if(j==-1){
                i++;
            }else{
                j = prefix[j];
            }
        }
    }
    return -1;
}

function kmp(text, pattern){
    for(let i=0; i<text.length; i++){
        text = text.slice(1)+text[0];
        let res = kmpSearch(text, pattern);
        if(res>=0){
            return 1;
        }
    }
    return 0;
}

let text = "AABCD";
let patterns = ["CDAA", "ABCD", "CFS"];
patterns.forEach(e=>{
    console.log(kmp(text, e));
});