尽管在范围内迭代,但字符串索引超出范围
String index out of range despite iterating within a range
我正在尝试使用 Python 构建一个强大的密码检查器。密码条件如下:
- 最少6个字符,最多20个字符。
- 必须至少包含一个小写字母,至少一个大写字母,
和至少一位数。
- 它不能连续包含三个重复字符(假设满足其他条件,“...aaa...”是弱字符,但“...aa...a...”是强字符).
编写一个函数 strongPasswordChecker(s),它将字符串 s 作为输入,return 使 s 成为强密码所需的最小更改。如果s已经很强,return0.
任何一个字符的插入、删除或替换都被视为一次更改。
以下是我的尝试:
import re
class Solution:
def strongPasswordChecker(self, s: str) -> int:
# Holds the change
change = 0
# Checks if the password length is less than 6
if len(s) < 6:
change += 6 - len(s)
# Checks if the password length is greater than 20
elif len(s) > 20:
change += len(s) - 20
# Checks if the password has at least one digit
elif re.search(r'\d', s):
change += 1
# Checks if the password has at least one upper case letter
elif re.search(r'[A-Z]', s):
change += 1
# Checks if the password has at least one lower case letter
elif re.search(r'[a-z]', password):
change += 1
# Checks for repeating characters
for i in range(1, len(s)):
if i >= 3 and i < len(s):
if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
change += 1
return change
尽管使用上面的 if 语句检查了重复字符,我仍然收到以下错误:
IndexError: String Index out of range
问题是这个语句可能会越界,例如当 i == len(s) - 1
那么 s[i + 1]
和 s[i + 2]
都会索引越界。
for i in range(1, len(s)):
if i >= 3 and i < len(s):
if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
change += 1
如果你想确保没有 3 人或以上的团体,我会使用 itertools.groupby
>>> any(len(list(g)) > 2 for k, g in groupby('aabbcc'))
False
>>> any(len(list(g)) > 2 for k, g in groupby('aabbbbbcc'))
True
要替换代码中的 for
循环,您可以像这样使用
elif any(len(list(g)) > 2 for k, g in groupby(s)):
change += 1
我正在尝试使用 Python 构建一个强大的密码检查器。密码条件如下:
- 最少6个字符,最多20个字符。
- 必须至少包含一个小写字母,至少一个大写字母, 和至少一位数。
- 它不能连续包含三个重复字符(假设满足其他条件,“...aaa...”是弱字符,但“...aa...a...”是强字符).
编写一个函数 strongPasswordChecker(s),它将字符串 s 作为输入,return 使 s 成为强密码所需的最小更改。如果s已经很强,return0.
任何一个字符的插入、删除或替换都被视为一次更改。
以下是我的尝试:
import re
class Solution:
def strongPasswordChecker(self, s: str) -> int:
# Holds the change
change = 0
# Checks if the password length is less than 6
if len(s) < 6:
change += 6 - len(s)
# Checks if the password length is greater than 20
elif len(s) > 20:
change += len(s) - 20
# Checks if the password has at least one digit
elif re.search(r'\d', s):
change += 1
# Checks if the password has at least one upper case letter
elif re.search(r'[A-Z]', s):
change += 1
# Checks if the password has at least one lower case letter
elif re.search(r'[a-z]', password):
change += 1
# Checks for repeating characters
for i in range(1, len(s)):
if i >= 3 and i < len(s):
if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
change += 1
return change
尽管使用上面的 if 语句检查了重复字符,我仍然收到以下错误:
IndexError: String Index out of range
问题是这个语句可能会越界,例如当 i == len(s) - 1
那么 s[i + 1]
和 s[i + 2]
都会索引越界。
for i in range(1, len(s)):
if i >= 3 and i < len(s):
if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
change += 1
如果你想确保没有 3 人或以上的团体,我会使用 itertools.groupby
>>> any(len(list(g)) > 2 for k, g in groupby('aabbcc'))
False
>>> any(len(list(g)) > 2 for k, g in groupby('aabbbbbcc'))
True
要替换代码中的 for
循环,您可以像这样使用
elif any(len(list(g)) > 2 for k, g in groupby(s)):
change += 1