質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1774閲覧

C++ で Time Limit Exceededがでます。

alizona

総合スコア126

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/29 07:26

編集2020/06/29 08:58

問題文

C++

1文字列が与えられると、その中の最初の繰り返されない文字を見つけ、 2そのインデックスを返します。 存在しない場合は、-1を返します。 3文字列に小文字の英字のみが含まれていると想定する場合があります。

C++ で Time Limit Exceededがでます。
コードに無駄な繰り返しや助長なものがあるのでしょうか?
アドバイスをいただけないでしょうか?

私の書いた回答

C++

1class Solution { 2public: 3 int firstUniqChar(string s) { 4 5 int size=(int)(s.length()); 6 bool repeat; 7 8 for(int i=0;i<size;i++){ 9 10 repeat=false; 11 12 for(int j=0;j<size;j++){ 13 14 if(i!=j){ 15 if(s[i]==s[j]) 16 repeat=true; 17 } 18 } 19 if(repeat==false){ 20 return i; 21 } 22 } 23 return -1; 24// int nonRepeatedNum; 25// if(size==1){ 26// return 0; 27// }else if(size==0){ 28// return -1; 29// } 30 31// for(int i=0;i<=size;i++){ 32 33// repeat=false; 34// nonRepeatedNum=-1; 35 36// if(i!=size-1){ 37// //上り(要素数の小さい方から大きい方へと比較していく) 38// for(int j=i+1;j<size;j++){ 39// if(s[i]==s[j]){ 40// repeat=true; 41// } 42// } 43 44// //下り(要素数の大きい方から小さい方へと比較していく 45// if(i>0){ 46// for(int k=i-1;k>=0;k--){ 47 48// if(s[i]==s[k]){ 49// repeat=true; 50// } 51// } 52// } 53// //最後の文字から、要素数の小さい方へと比較していく 54// }else if(i==size-1){ 55// for(int m=size-2;m>=0;m--){ 56// if(s[i]==s[m]){ 57// //cout<<"last 1"<<endl; 58// repeat=true; 59// //最後の2文字を後ろから比較したから、 60// //iにsizeを 61// //代入して、ループを終わらせる 62// i=size; 63// } 64// } 65// } 66 67// if(nonRepeatedNum==-1 && repeat==false){ 68// //つまり、一つ目の、繰り返しのなかった数字 69// nonRepeatedNum=i; 70// break; 71// } 72// } 73 74// if(nonRepeatedNum==-1){ 75// return -1; 76// }else{ 77// return nonRepeatedNum; 78// } 79 } 80};

エラーになる時のテストケースです。長すぎるので省略してます。

C++

1"sdnvlbkrmtbollujsdjfjfppksravjkwwsimlmdtcmiilpjibjhcppluisqbqfwrjjlrapsmcwrsrnfrmtjrffpuuqwonqfjfqxellpvmcfmhxccljqlvboioelpfcawrxlwsajfaiehutvogduhobwgpogvatpbvoaognbepqnkhkjsvqmfaghavopppcjbjunuaeotpkbfsmeqikjflakgjexnqqgxnsdjolbjbvhr....

###LeetCodeというプログラミング問題サイトの問題です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2020/06/29 07:29

"繰り返されない文字"とは? 一度しか出現しない文字ってこと?
alizona

2020/06/29 07:37

はい。そうです。繰り返さない一番左のcharを見つける問題です。
guest

回答1

0

ベストアンサー

たぶんコッチの方が速いはず

C++

1#include <unordered_map> 2#include <string> 3 4class Solution { 5public: 6 int firstUniqChar(const std::string& s) { 7 std::unordered_map<char,int> hist; // 度数分布表 8 // 度数分布表をつくり、 9 for ( char ch : s ) { 10 hist[ch]++; 11 } 12 // 度数が1の文字を見つけたら返して終了。 13 for ( int i = 0; i < s.size(); ++i ) { 14 if ( hist[s.at(i)] == 1 ) return i; 15 } 16 return -1; // なかったら-1 17 } 18};

[つけたし] ハッシュ表使うまでもないか...

C++

1#include <string> 2#include <algorithm> 3 4class Solution { 5public: 6 int firstUniqChar(const std::string& s) { 7 int hist[256]; 8 std::fill(hist, hist+256, 0); 9 for ( char ch : s ) { 10 hist[ch]++; 11 } 12 for ( int i = 0; i < s.size(); ++i ) { 13 if ( hist[s.at(i)] == 1 ) return i; 14 } 15 return -1; 16 } 17}; 18 19#include <iostream> 20 21int main() { 22 Solution s; 23 std::cout << s.firstUniqChar("abcdefghijkld") << std::endl; 24}

投稿2020/06/29 07:42

編集2020/06/29 08:14
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alizona

2020/06/29 09:09

ありがとうございました。 自分のコードもだいぶ短くはしたのですが、やはり、forloopを2つ使って、1度しか出現しない文字を探すのはよくないのですね。 unordered_mapについて、stroustrupsのC++の本で読んでいたので、理解することができました。 自分のコードもincrementする形のコードに変更します。 ありがとうございました。
episteme

2020/06/29 09:14

二重のfor-loopだと文字列長の二乗で効いてくるからねー
alizona

2020/06/29 09:20

はい。すでに2度出現してることを確認したa==b を b==a でも確認してました。今、やっとふに落ちて、いただいた回答を理解できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問