LeetCode459. 重复的子字符串

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

示例 1:

输入: “abab”

输出: True

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

输入: “aba”

输出: False
示例 3:

输入: “abcabcabcabc”

输出: True

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

class Solution(object):
    def repeatedSubstringPattern(self, s):
        """
        :type s: str
        :rtype: bool
        """
        # 找出字符串长度可以整除的数字,然后根据长度选定子字符串。
        # count该子字符串出现的次数,判断子字符串的长度乘以出现次数是否等于字符串长度。
        if len(s) == 0:
            return True
        if len(s) == 1:
            return False
        temp = []
        # 考虑字符串全部为同一字母组成的情况
        if s.count(s[0]) == len(s):
            return True
        for i in range(2,len(s)//2+1):
            if len(s)%i == 0:
                temp.append(i)
        ss = ''
        for j in temp:
            ss = s[:j]
            count = s.count(ss)
            if len(ss)*count == len(s):
                return True
        return False

解法2:正则表达式 import re
正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。
特殊字符
所谓特殊字符,就是一些有特殊含义的字符,如上面说的 runoob 中的 ,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在**其前加一个 *: runo*ob 匹配 runoob。
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。下表列出了正则表达式中的特殊字符:

LeetCode459. 重复的子字符串_第1张图片
例如:

  1. runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
  2. runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
  3. colou?r ,可以匹配 color 或者 colour,? 问号代表前面的字符最多只可以出现一次(0次、或1次)。

解法3:

class Solution(object):
    def repeatedSubstringPattern(self, s):
        """
        :type s: str
        :rtype: bool
        """
        # 假设字符串S是由子字符串s重复N次而成,则S+S则由s重复2N次,现在S=Ns,S+S=2Ns,因此,S在S+S[1:-1]中必须出现一次以上
        return s in (s+s)[1:-1]

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