linkという質問では、まず文字配列を使って試しました。この解決策は期限を超えました。C++の文字列とchar配列の宣言の時間の複雑さの違いは何ですか?
char s[100000];
cin >> s;
int cnt[26];
for(int i=0;i<26;++i)
cnt[i]=0;
for(int i=0;i<strlen(s);++i)
cnt[s[i]-'a']++;
int count =0;
for(int i=0;i<26;++i)
if(cnt[i]>0)
count++;
cout << count << endl;
しかし、私はこれに上記のコードを変更:
string s;
cin >> s;
int cnt[26];
for(int i=0;i<26;++i)
cnt[i]=0;
for(int i=0;i<s.length();++i)
cnt[s.at(i)-'a']++;
int count =0;
for(int i=0;i<26;++i)
if(cnt[i]>0)
count++;
cout << count << endl;
そして簡単に渡されたコード。また、最初のものは1秒の制限時間を超え、2回目は0.04秒の実行時間を過ぎた。なぜそのような実行時間に大きな違いがありますか?
入力の長さはどれくらいですか? – GMichael
文字列<100000 – yobro97
のサイズは、 'for'ループを保存しません:' int cnt [26] = {0} '。 'cnt [s.at(i) - 'a'] ++;' at'は文字列をあふれさせていないことをテストするので、少し時間を節約できます。あなたはすでにforループの境界でこれを保証しているので、 'c [[i] - 'a'] ++;'。コンパイラがforループで実行できる最適化ゲームがいくつかあります:for(char ch:s)cnt [ch -aa] ++; 'もしそうでなければ、コードは少しきれいです。 – user4581301