题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
对于一个密码验证格式,有3点要求:
- 密码长度大于8 --> 判断code的size
- 必须有大小写,数字,其他字符4种中的3种 --> 遍历,只要多出现一种类型就记录+1
- 判断是否有重复的长度大于2的公共子串
难点在于如何判断公共子串,使用双指针来判断:
主指针:遍历每个字符
副指针:在主指针后3个字符开始,查找有没有相同字符
若有,则开始判断3个长度的主、副子串是否相同。相同则存在,不相同,则移动主指针
若无,接着移动副指针
#include <cstring> #include <iostream> #include <string> using namespace std; bool find_substr(string code){ int len = size(code); int ind_start = 0; while(ind_start < len-5){ char indCheck = code[ind_start]; int ind_sub_start = ind_start+3; while(ind_sub_start<len-2){ if(code[ind_sub_start] != indCheck) ind_sub_start++; else{ int lenCheck = 3; string strCheck = code.substr(ind_start, lenCheck); string strSub = code.substr(ind_sub_start, lenCheck); if(strCheck == strSub) return true; else break; } } ind_start ++; } return false; } bool judge(string code){ int len = size(code); if(len < 8) return false; else{ int count = 0; bool flag[4] = {false}; for(int i = 0; i < len; i ++){ if(code[i] >= '0' && code[i] <= '9') flag[0] = true; else if(code[i] >= 'A' && code[i] <= 'Z') flag[1] = true; else if(code[i] >= 'a' && code[i] <= 'z') flag[2] = true; else flag[3] = true; } for(int i = 0; i < 4; i ++){ if(flag[i]) count ++; } if(count < 3) return false; else{ if(find_substr(code)) return false; else return true; } } } int main() { string s; while(getline(cin, s)){ if(judge(s)) cout << "OK" << endl; else cout << "NG" << endl; } } // 64 位输出请用 printf("%lld")