假设我们有一个字符串,密码。我们必须找出使密码更安全所需的最小更改。因此密码具有以下一些条件-
长度至少为6个字符,最长为20个字符
它必须包含至少一个小写字母,至少一个大写字母和至少一个数字字符。
它不能连续包含三个重复字符,例如…aaa…,…PPP…,…888…。
因此,如果输入像“ aa26bbb”,那么我们至少需要进行一次更改,因为没有大写字母,并且连续存在三个b,因此我们可以用一个大写字母替换任何b使其变强。
为了解决这个问题,我们将遵循以下步骤-
设置missingTypes:= 3。
如果它至少有一个小写字母,则将missingTypes减少1
如果它至少有一个大写字母,则将missingTypes减少1
如果它至少有一个数字,则将missingTypes减少1
更改:= 0,一个:= 0和两个:= 0,p:= 2
当p <s的大小时
长度:= 2
当p <s的大小且s [p] = s [p – 1]时,
更改:=更改+长度/ 3
如果长度被3整除,则增加1
否则,当长度可被3整除时,再将其增加1
长度:=长度+ 1
p:= p + 1
如果s [p]与s [p – 1]相同,并且也与s [p-2]相同,则
否则将p增加1
如果s的大小<6,则返回missing_type的最大值和6 – s的大小
否则,当s的大小<20时,则返回missing_type的最大值并进行更改
除此以外
删除:= s的大小– 20
更改:=更改–最小删除和一个
更改:=更改–(最小(删除的最大值–一个和0)和两个* 2)/ 2
更改:=更改–(最大删除次数–一– 2 *二和0)/ 2
返回delete + missing_type的最大值并进行更改
让我们看下面的实现以更好地理解-
class Solution(object): def strongPasswordChecker(self, s): missing_type = 3 if any('a' <= c <= 'z' for c in s): missing_type -= 1 if any('A' <= c <= 'Z' for c in s): missing_type -= 1 if any(c.isdigit() for c in s): missing_type -= 1 change = 0 one = two = 0 p = 2 while p < len(s): if s[p] == s[p-1] == s[p-2]: length = 2 while p < len(s) and s[p] == s[p-1]: length += 1 p += 1 change += length / 3 if length % 3 == 0: one += 1 elif length % 3 == 1: two += 1 else: p += 1 if len(s) < 6: return max(missing_type, 6 - len(s)) elif len(s) <= 20: return max(missing_type, change) else: delete = len(s) - 20 change -= min(delete, one) change -= min(max(delete - one, 0), two * 2) / 2 change -= max(delete - one - 2 * two, 0) / 3 return delete + max(missing_type, change) ob = Solution()print(ob.strongPasswordChecker('aa26bbb'))
“aa26bbb”
输出结果
1