# Greedy# String Manipulation# Conditional Logic

e840 - P7. 密碼強度測試(Passwords)

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算密碼強度,根據密碼中字母、數字的數量以及連續數字的數量進行加減分。密碼長度、是否包含字母和數字、是否達到最低要求(長度>=8,包含字母和數字)都會影響最終得分。

解題思路

程式碼遍歷密碼字串,統計字母、數字的數量,並檢查連續數字的數量。根據題目規則,對每個字元進行加分或減分。最後,根據密碼是否達到最低要求進行額外加分或減分。程式使用貪心策略,逐字計算得分,並在遍歷過程中更新總分。

複雜度分析

  • 時間複雜度: O(n),其中 n 是密碼的長度。程式需要遍歷密碼字串一次。
  • 空間複雜度: O(1),程式使用固定數量的變數來儲存計數和總分,不隨輸入大小變化。

程式碼

#include <iostream>
using namespace std;
int main(){
	string a;
	cin >> a;
	int al=a.length(),nn=0,ans=al*3,en=0,nall=0;
	bool n=0;
	for(int i=0;i<al;++i){
		if(a[i]>='0'&&a[i]<='9'){
			n=1;
			++nn;
			++nall;
		}
		else{
			if(nn>1)
				ans-=(nn-1)*2;
			nn=0;
		}
		if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z'))
			++en;
	}
	if(nn>1)ans-=(nn-1)*2;
	ans+=en*3;
	ans+=nall*2;
	if(al>=8&&en!=0&&n==1)
		ans+=10;
	else
		ans-=5;
	if(en==0&&n)
		ans-=al;
	if(en&&n==0)
		ans-=al;
	cout << ans ; 
}

Discussion