原题出自:https://leetcode.cn/problems/repeated-substring-pattern/
题目:
题解:
1、字符串长度为空,则返回false。
2、字符串长度为1,则为true,是由子串构成的。
3、字符串长度为2,判断首尾字符是否相等,相等则为true。
4、字符串长度大于2,则需要「枚举」子串。
1)子串最大长度不能超过字符串的一半。
2)子串个数是字符串的偶数倍。
3)当子串长度为n时,s[i]位置s[i+n]位置的值应一致。
代码:
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
n = len(s) #全长
#子串最大长度不会超过字符串的一半长度,所以默认子串最大循环长度为n//2+1 11//2+1=6
for sub_n in range(1, n//2 + 1):
# 子串长度应为字符串的整数倍,所以采用余数算法
if n % sub_n == 0:
# 从0号位置开始,循环判断后面的字符是否等于前面的子串
if all(s[j] == s[j - sub_n] for j in range(sub_n, n)):
return True
return False
python的all()函数:判定给定的迭代参数是否都为true
测试用例:
面试时经常会被问到,针对此算法题,设计下测试用例。
1)等价类划分法:在需求范围内挑选1条有效、无效的字符串。例如:aa、aba;
2)边界值法:在超出需求范围外挑选字符串。
3)错误推算法:基于经验去除推算可能出错的地方,例如:为空、参数验证。
4)判定表分析:所有条件的组合。