这道题也就是三个判断,第一个判断,第二个判断,很简单第二个一个循环就可以统计出来,主要难点在第三个判断上,关于第三个判断给出一个大神写的博客自己体会一下
http://blog.csdn.net/hackbuteer1/article/details/7968623
在此简单说一下,主要分三步
1.建立后缀数组
2.排序
3.相邻比较
整体时间复杂度最大的在排序,快排的时间复杂度为O(n*logn),但是对于每两个元素进行比较的时候,时间复杂度是O(n)不是O(1),以为比较的是字符串,所以整体时间复杂度为O(n*n*logn),而普通的算法时间复杂度为O(n*n*n)
下面给出代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int cmpLen(string a,string b)
{
int i = 0;
while (i < a.size() && i < b.size())
{
if (a[i] == b[i])
{
i++;
}
else
{
break;
}
}
return i;
}
bool JudgeRepeat(string inStr)
{
//建立后缀数组
vector<string> last;
string tmp = "";
int i = inStr.size() - 1;
int maxLen = 0;
int len = 0;
for (; i >= 0; i--)
{
tmp = inStr[i] + tmp;
last.push_back(tmp);
}
//快速排序
sort(last.begin(),last.end());
//比较
for (i = 0; i < last.size() - 1; i++)
{
len = cmpLen(last[i], last[i + 1]);
if (len > maxLen)
{
maxLen = len;
}
}
if (maxLen <= 2)
{
return true;
}
else
{
return false;
}
}
bool JudgeType(string inStr)
{
int len = inStr.size();
int type = 0, num = 0, upper = 0, lower = 0, other = 0;
for (int i = 0; i < len; i++)
{
if (inStr[i] >= '0'&&inStr[i] <= '9')
{
num++;
}
else if (inStr[i] >= 'a'&&inStr[i] <= 'z')
{
lower++;
}
else if (inStr[i] >= 'A'&&inStr[i] <= 'Z')
{
upper++;
}
else
{
other++;
}
}
if (num > 0)
{
type++;
}
if (lower > 0)
{
type++;
}
if (upper > 0)
{
type++;
}
if (other > 0)
{
type++;
}
if (type < 3)
{
return false;
}
return true;
}
string Judge(string inStr)
{
int len = inStr.size();
if (len <= 8)
{
return "NG";
}
if (!JudgeType(inStr))
{
return "NG";
}
if (!JudgeRepeat(inStr))
{
return "NG";
}
return "OK";
}
int main()
{
string inStr = "";
while (getline(cin, inStr))
{
cout << Judge(inStr) << endl;
}
return 0;
}