题目:
题解:
3.不能有长度大于2的包含公共元素的子串重复
采用长度为三的滑动窗口,截取子串,判断子串是否在密码中重复出现。
public boolean validPassword(String password) {
if (password.length() <= 8) {
return false;
}
char[] chars = password.toCharArray();
int exitUppercase = 0;
int exitLowercase = 0;
int exitNumber = 0;
int exitOther = 0;
boolean success = false;
for (char aChar : chars) {
if (isUppercase(aChar)) {
exitUppercase = 1;
}
if (isLowercase(aChar)) {
exitLowercase = 1;
}
if (isNumber(aChar)) {
exitNumber = 1;
}
if (isOther(aChar)) {
exitOther = 1;
}
if (exitUppercase + exitLowercase + exitNumber + exitOther >= 3) {
success = true;
}
}
if (!success) {
return false;
}
for (int i = 0; i < chars.length-3; i++) {
int j = i+3;
String subString = password.substring(i, j);
if (password.indexOf(subString) != password.lastIndexOf(subString)) {
return false;
}
}
return true;
}
public boolean isUppercase(char ch) {
return ch >= 'A' && ch <= 'Z';
}
public boolean isLowercase(char ch) {
return ch >= 'a' && ch <= 'z';
}
public boolean isNumber(char ch) {
return ch >= '0' && ch <= '9';
}
public boolean isOther(char ch) {
return !isUppercase(ch) && !isLowercase(ch) && !isNumber(ch) && ch != ' ' && ch !='\n';
}
时间复杂度:O(n)