【问题描述】
【问题描述】
开发一个密码检查软件,密码要求:
长度超过8位
包括大小写字母.数字.其它符号,以上四种至少三种
不能有相同长度大于或等于2的子串重复
【输入形式】
一组或多组长度超过2的子符串。每组占一行
【输出形式】
如果符合要求输出:OK,否则输出NG
【样例输入】
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
【样例输出】
OK
NG
NG
OK
【问题分析】
- 按照所给的三个要求分别进行判断即可。
- 其中条件3:不能有相同长度大于或等于2的子串重复,此处判断是否有长度为2的子串重复即可。因为如有大于等于2的子串重复,那么必定会有等于2的子串重复。
【代码】
import java.util.*;
public class Ex5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String s,snow,smed;
char[] c=new char[2];
int[] A=new int[4];
while(in.hasNext())
{
judge:
{
s="";
s=in.nextLine();
if(s.length()==0)
{
break judge;
}
if(s.length()<8)
{
System.out.println("NG");
break judge;
}
snow="";
smed="";
c[0]='\0';
for(int i=0;i<4;i++)
{
A[i]=0;
}
for(int i=0;i<s.length();i++)
{
c[1]=s.charAt(i);
if(c[1]>='A'&&c[1]<='Z')
{
A[0]=1;
}
else if(c[1]>='a'&&c[1]<='z')
{
A[1]=1;
}
else if(c[1]>='0'&&c[1]<='9')
{
A[2]=1;
}
else
{
A[3]=1;
}
smed=smed+c[1];
if(smed.length()>=2)
{
if(smed.length()>2)
{
smed=smed.substring(1);
}
if(snow.indexOf(smed)>=0)
{
System.out.println("NG");
break judge;
}
}
if(i>0)
{
snow=snow+c[0];
}
c[0]=c[1];
}
if(A[0]+A[1]+A[2]+A[3]<3)
{
System.out.println("NG");
break judge;
}
System.out.println("OK");
}
}
}
【学习】
- 子串重复判断:
snow.indexOf(smed)>0
即可判断smed是否是snow的子串,若是则返回smed子串在snow中的位置,否则返回-1.- 移除字符串的第一个元素:
s.substring(1);
即可得到从第2个元素开始的s字符串的子串,相当于移除了字符串的第一个元素。