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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    第04组(64) 团队展示
    结对编程作业
    第一次个人编程作业
    寒假第二份大礼包
    热身礼包初体验,欢欢喜喜过大年
    第08组 Beta冲刺 (1/5)
    第08组 Alpha冲刺 总结
    第五次作业
    第08组 Alpha冲刺 (6/6)
    第08组 Alpha冲刺 (5/6)
  • 原文地址:https://www.cnblogs.com/cjjjj/p/12507967.html
Copyright © 2011-2022 走看看