zoukankan      html  css  js  c++  java
  • 算法(判断字符串是否可以由它的一个子串重复多次构成)

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

    示例 1:

    输入: "abab"

    输出: True

    解释: 可由子字符串 "ab" 重复两次构成。
    示例 2:

    输入: "aba"

    输出: False
    示例 3:

    输入: "abcabcabcabc"

    输出: True

    解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

    解题思路
    如果您的字符串S包含一个重复的子字符串,那么这意味着您可以多次“移位和换行”您的字符串,并使其与原始字符串匹配。
    例如:abcabc
    转变:cabcab
    改变两次:bcabca
    改变三次:abcabc

    现在字符串和原字符串匹配了,所以可以得出结论存在重复的子串

    基于这个思想,可以每次移动k个字符,直到匹配移动length - 1次。但是这样对于重复字符串很长的字符串,效率会非常低。在LeetCode中执行时间超时了。

    为了避免这种无用的环绕,可以创建一个新的字符串str,它等于原来的字符串S再加上S自身,这样其实就包含了所有移动的字符串。

    比如字符串:S = acd,那么str = S + S = acdacd

    acd移动的可能:dac、cda。其实都包含在了str中了。就像一个滑动窗口

    一开始acd (acd) ,移动一次ac(dac)d,移动两次a(cda)cd。循环结束

    所以可以直接判断str中去除首尾元素之后,是否包含自身元素。如果包含。则表明存在重复子串。

    func repeatedSubstringPattern(s string) bool {
        sTemp := s + s
        sTemp = sTemp[1 : len(sTemp)-1] 
        if (strings.Index(sTemp, s) >= 0) {
            return true
        } else {
            return false
        }
    }

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/repeated-substring-pattern
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    CF827D Best Edge Weight
    克鲁斯卡尔重构树总结
    模拟赛 提米树 题解 (DP+思维)
    luogu P4781 【模板】拉格朗日插值
    luogu P5826 【模板】子序列自动机
    子序列自动机
    luogu P1368 工艺 /【模板】最小表示法
    最小表示法
    SP1812 LCS2
    FZOJ 3602 T2
  • 原文地址:https://www.cnblogs.com/cjjjj/p/12507967.html
Copyright © 2011-2022 走看看