密码要求:
注:其他符号不含空格或换行
数据范围:输入的字符串长度满足 1 ≤ n ≤ 100
一组字符串。
如果符合要求输出:OK,否则输出NG
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111
输出:
OK
NG
NG
OK
OK
package main
import (
"bufio"
"fmt"
"os"
"unicode"
)
// 密码长度校验 密码长度超过8位 校验通过
func passwordLengthCheck(password string) bool {
if len(password) <= 8 {
return false
}
return true
}
// 密码字符种类校验 密码包括:大写字母/小写字母/数字/其它符号,以上四种至少三种 校验通过
func passwordContainCheck(password string) bool {
hasLower, hasUpper, hasDigit, hasSpecial := false, false, false, false
for _, char := range password {
if unicode.IsLower(char) {
hasLower = true
} else if unicode.IsUpper(char) {
hasUpper = true
} else if unicode.IsDigit(char) {
hasDigit = true
} else if char != ' ' && char != '\n' {
hasSpecial = true
}
}
types := 0
if hasLower {
types++
}
if hasUpper {
types++
}
if hasDigit {
types++
}
if hasSpecial {
types++
}
// 校验
if types >= 3 {
return true
}
return false
}
// 密码子串校验 不能分割出两个相等的长度大于 2 的子串 校验通过
func passwordRepeatCheck(password string) bool {
rm := make(map[string]struct{})
length := len(password)
for i := 3; i < length/2; i++ {
for j := 0; j < length-i; j++ {
subStr := password[j : j+i]
if _, ok := rm[subStr]; ok {
return false
}
rm[subStr] = struct{}{}
}
}
return true
}
// 主函数
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
password := scanner.Text()
// 长度校验
if passwordLengthCheck(password) && passwordContainCheck(password) && passwordRepeatCheck(password) {
fmt.Println("OK")
} else {
fmt.Println("NG")
}
}
}
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
password := scanner.Text()
}
for _, char := range password {
if unicode.IsLower(char) {
hasLower = true
} else if unicode.IsUpper(char) {
hasUpper = true
} else if unicode.IsDigit(char) {
hasDigit = true
} else if char != ' ' && char != '\n' {
hasSpecial = true
}
}
rm := make(map[string]struct{})
for i := 3; i < length/2; i++ {
}
for j := 0; j < length-i; j++ {
subStr := password[j : j+i]
}
if _, ok := rm[subStr]; ok {
return false
}