leetcode之Strong Password Checker解法
这个问题的大概意思是检查密码强度,有三个要求
1.密码长度在6到20位之间
2.必须包含大小写字母和数字
3.不允许三个及以上重复字符
函数返回结果是将不符合的密码变成合适的密码所需要的操作次数,启动增减,修改,删除都算一次操作
这个问题,我的思路怎么都没有理清楚,但是代码通过了。
首先,分三种情况讨论,当小于等于20的时候,很容易搞定
而当大于20时候的删除,却是麻烦。第一次写C#语言就碰到这个问题,很难说清楚
不过这里的C#语言没有用到什么高深的知识,代码也很容易转化为C语言版的
public class Solution {
public int StrongPasswordChecker(string s)
{
char[] pwd;
int len,temp=0,t=0;
pwd=s.ToCharArray();
len=s.Length;
if(len<6)
{
temp=6-len;
t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
return temp>=t?temp:t;
}
if(len<21)
{
temp=repeat_check(pwd);
t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
return temp>=t?temp:t;
}
else
{
List<int> repeat = new List<int>();
int i=0,j;
t=number_check(pwd)+uppercase_check(pwd)+lowercase_check(pwd);
while(i<s.Length-1)
{
j=i+1;
while(j<s.Length)
{
if(s[i]==s[j])
{
j++;
}
else
{
break;
}
}
if(j-i>2)
{
repeat.Add(j-i);
}
i=j;
}
int delete=len-20;
repeat.Sort();
for(int m=0;m<repeat.Count;m++)
{
if(delete>=(repeat[m]%3+1))
{
delete-=1+repeat[m]%3;
repeat[m]-=1+repeat[m]%3;
}
if(delete==0)
{
break;
}
}
if(delete>0)
{
for(int n=0;n<repeat.Count;n++)
{
while(repeat[n]>2)
{
if(delete>2)
{
repeat[n]-=3;
delete-=3;
}
else
{
repeat[n]-=delete;
delete=0;
}
if(delete==0)
{
break;
}
}
if(delete==0)
{
break;
}
}
}
foreach (var item in repeat)
{
temp+=item/3;
}
return len-20+(temp>t?temp:t);
}
}
public int repeat_check(char[] s)
{
int i=0,t=0;
while(i<s.Length-2)
{
if(s[i]==s[i+1]&&s[i]==s[i+2])
{
t++;
i+=3;
continue;
}
i++;
}
return t;
}
public int number_check(char[] s)
{
int i=0;
for(i=0;i<s.Length;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
return 0;
}
}
return 1;
}
public int uppercase_check(char[] s)
{
int i=0;
for(i=0;i<s.Length;i++)
{
if(s[i]>='A'&&s[i]<='Z')
{
return 0;
}
}
return 1;
}
public int lowercase_check(char[] s)
{
int i=0;
for(i=0;i<s.Length;i++)
{
if(s[i]>='a'&&s[i]<='z')
{
return 0;
}
}
return 1;
}
}