重复的子字符串 - 正则表达式 - python javascript

leetcode:459题

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

输入: “abab”

输出: True

输入: “aba”

输出: False

输入: “abcabcabcabc”

输出: True

#python 解法1
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        return (s + s).find(s, 1) != len(s)
#python 解法2(暴力)
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        # 从起始位置长度倒序截取s长度为1-(len(s)/2)的子串
        for i in range(len(s)//2,0,-1):
            substring=s[:i]
            # 子串在s中检查一遍,如果都成功,则返回True
            result=True
            if len(s)%len(substring)!=0:
                result=False
            else:
                for j in range(len(s)//len(substring)):
                    if substring!=s[j*i:j*i+i]:
                        result=False
                        break
            if result:return True
        return False
#python 解法3(kmp+暴力)
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        def kmp(query: str, pattern: str) -> bool:
            n, m = len(query), len(pattern)
            fail = [-1] * m
            for i in range(1, m):
                j = fail[i - 1]
                while j != -1 and pattern[j + 1] != pattern[i]:
                    j = fail[j]
                if pattern[j + 1] == pattern[i]:
                    fail[i] = j + 1
            match = -1
            for i in range(1, n - 1):
                while match != -1 and pattern[match + 1] != query[i]:
                    match = fail[match]
                if pattern[match + 1] == query[i]:
                    match += 1
                    if match == m - 1:
                        return True
            return False
        
        return kmp(s + s, s)
//js解法(正则)
var repeatedSubstringPattern = function(s) {
  var reg = /^(\w+)\1+$/
  return reg.test(s)
};

思路和规律:

  • 思路1:从起始位置长度倒序截取s长度为1-(len(s)/2)的子串,判断其能不能正好将字符串划分
  • 思路2:将两个原字符串拼接,判断原字符串在新字符串中首次出现的位置,弱位置在中间考前,则说明有循环重复
  • 思路3:思路1+kmp匹配算法

API:

  • Python:
    • str.find(查找内容,查找范围开始位置=0,查找范围结束位置=len(string)). 返回值为出现位置的索引
  • Js:
    • reg = /^(\w+)\1+$/
      • ^:以匹配内容开头
      • &:以匹配内容结尾
      • (一组字符)
      • \w:一个数字,或大小写字母
      • +:出现至少一次
      • \1:重复前面的部分一次
    • reg.test(s):检测指定正则表达式能否匹配成功

你可能感兴趣的:(算法,字符串,正则表达式,leetcode,python,算法)