zoukankan      html  css  js  c++  java
  • 459. 重复的子字符串 next数组

    459. 重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

    输入: "abab"
    输出: True
    解释: 可由子字符串 "ab" 重复两次构成。
    

    题解

    next数组每一个值代表除当前点的最长公共前后缀长度-1的值,若符合条件,最后一个next值就是倒数第二个重复子串的尾巴的索引,例如abcdabcdabcdabcd最后一个next值等于11,也就是倒数第二个d的索引,通过这个索引求出重复子串长度15-11=4,再比较前4个字母和后4个字母是否相等即可判断

    /**
     * @param {string} s
     * @return {boolean}
     */
    function getNext(str) {
        let i = 0, j = -1, next = [-1];
        while (i < str.length) {
            if (j === -1 || str[i] === str[j]) {
                next[++i] = ++j;
            } else {
                j = next[j];
            }
        }
        return next;
    }
    var repeatedSubstringPattern = function (s) {
        //排除长度为1的情况
        if (s.length === 1) return false;
        // 获取next数组
        let next = getNext(s);
        //重复子串的长度
        let len = s.length - 1 - next[s.length - 1]; console.log(next[s.length - 1])
        /* 前len和后len个相等 */
        return s.slice(0, len) === s.slice(-len);//abcd abcd
    };
    console.log(repeatedSubstringPattern("abcdabcdabcdabcd"))
    
  • 相关阅读:
    MySQL大表优化方案
    写一个简单脚本检测mysql主从是否正常
    Nginx配置基于ip的虚拟主机
    推荐一些好的linux学习网站
    shell基础入门(一)
    centos7和linux防火墙配置入门
    centos7.0之vsftpd随笔
    获取系统相关属性
    linux 文件管理操作入门
    ANSI文件操作
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/13234519.html
Copyright © 2011-2022 走看看