漂亮的字符串(這個在上次發佈的漂亮字符串的基礎上做了優化)

題目:小蒜認爲如果一個字符串中每個字符出現的次數都是偶數次,那麼這個字符串是美麗的;
現在給你一個字符串 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章