#include <bits/stdc++.h>
using namespace std;
int n, cnt[27];
char s[35];
//-------------------------------------------------
bool check(){
map<int, int> M;
for(int i=0; i<26; i++){
if(cnt[i]!=0){
if(!M[cnt[i]]) M[cnt[i]] = i; //計數值對應字母序
else return false;
}
}
return true;
}
//-------------------------------------------------
int main(){
int Case=1;
while(~scanf("%d", &n)){
int total=0;
while(n--){
scanf("%s", s);
cnt[27]={};
for(int i=0; i<strlen(s); i++) cnt[s[i]-'a']++;
//cout<< (check() ? "YES\n" : "NO\n");
if(check()) total++;
}
printf("Case %d: %d\n", Case++, total);
}
}
錯誤訊息------------------------------------------------------------
您共輸出 1 行。
您共輸出 1 行。
不知何故??
//-------------------------------------------------
int main(){
int Case=1;
while(~scanf("%d", &n)){
int total=0;
while(n--){
scanf("%s", s);
cnt[27]={}; <<======== 這行並沒有把 cnt[]陣列清為0
for(int i=0; i<strlen(s); i++) cnt[s[i]-'a']++;
//cout<< (check() ? "YES\n" : "NO\n");
if(check()) total++;
}
printf("Case %d: %d\n", Case++, total);
}
}錯誤訊息------------------------------------------------------------
另請用下列測資試一下範例輸入:2adabbacccd2illnessa5aaaabbbccdaabbabcabcaabbccddabcaba範例輸出 :Case 1: 1Case 2: 0Case 3: 2
//-------------------------------------------------
bool check(){
map<int, int> M;
for(int i=0; i<26; i++){
if(cnt[i]!=0){
if(!M[cnt[i]]) M[cnt[i]] = i; <<=== 不應該設為0, 但有可能i=0
else return false;
}
}
return true;
}
===============
假設字串為 aabb應該傳回 false,但你的 check()會傳回 true
因為 cnt[0]=2 , cnt[1]=2
當i=0, M[2]==0 時應設為非0值, 但你的程式中又設為 M[2]=i
然後 i=1時, 檢查M[2]==0 又設定 M[2] = 1,並沒有傳回 false
---------
其實只要檢查 cnt[i]是否出現過,用set即可,unordered_set<int> M 會更快吧!
bool check()程式碼類似如下
...
if( cnt[i] )
{
if( M.count(cnt[i]) ) return 0;
M.insert( cnt[i] );
}
...
return(M.size()>1); //最少2種以上