題目:小蒜認爲如果一個字符串中每個字符出現的次數都是偶數次,那麼這個字符串是美麗的;
現在給你一個字符串 s,長度不超過 100,請判斷這個字符串是否是美麗的。
輸入格式
一個字符串s
輸出格式
如果是美麗的字符串,輸出 “Yes”,否則輸出 “No”。
示例:輸入:abaccaba
輸出Yes
輸入:hthth
輸出:No
思路:要對每個字符進行計數,則對每一個字符進行遍歷,有相同字符出現就加一,只要有一個字符出現的次數不是偶數次就輸出No,然後跳出循環。如果一個字符出現的次數是偶數次,則將sum重新變爲0,並做標記flag=1,再對下一個字符再進行遍歷。
但我的這個代碼還不夠優化,會對計數過的字符重複計數。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[100];
int sum=0;
int i,j,k;
int flag=0;
cin>>a;
int n=strlen(a);//獲得字符串長度
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++) //外層每從新的字符開始,內層都從第一個字符開始遍歷
{
if(a[j]==a[k])
{
sum++; //有相同字符就加一
}
}
if(sum%2==0)
{
sum=0;
flag=1;//如果說是偶數次,則將sum置零,重新計數,判斷下一個字符是否出現了偶數次
}
if(sum%2!=0)
{
cout<<"No"; //只要有一個字符不是偶數就不是漂亮字符
return 0;
}
}
if(flag==1) cout<<"Yes";
return 0;
}
它的優化代碼來咯!
思路:再用一個數組來標記已經計數過得字符,如果計數過就把它換爲1(這個也可以是其他的數),這樣再用一個contiue,巧妙地跳過了已經計數過得字符。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[101];
int b[101]={0};
cin>>a;
int n,sum=0;
n=strlen(a);
int i,j;
bool meili=true;
for(i=0;i<n;i++)
{
if(b[i]>0) continue;//如果b[i]大於0,則後面不運行,則再進行i++,判斷下一個字符
for(j=0;j<n;j++)
{
if(b[j]>0) continue;//同樣,如果b[i]大於1,則進行下一個j++,判斷下一個字符和這個字符是否一樣
if(a[j]==a[i])
{
sum++;
b[j]=1;//表示數已經處理過了,並把這個位置的字符變爲1
}
}//a[i]出現的次數
if(sum%2!=0)
{
meili=false;
break;
}
}
if(meili) cout<<"Yes";
else cout<<"No";
return 0;
}