819最も一般的な言葉
難易度:
中
アイデア:
問題、排除する単語の一部を処理して、文字列、(禁止)からなるワードライブラリーは、(大文字と小文字を区別しない)の記事の中で最も非禁止ワードが表示されますを確認するように依頼しました。
この問題は、最初に単一の単語に加工品、とのすべての取引の、またの非常に明確なアイデアで、すべてが挿入unordered_map、最終トラバースの結果を得るためのマップが続き、小文字に変換します
実際には、この質問の難しさは、しかし、従来のコードは単純ではないされていない、雄弁は誤って50または60行降りてきました
コード:
/*
Author Owen_Q
*/
class Solution {
public:
string mostCommonWord(string paragraph, vector<string>& banned) {
re.clear();
int st = 0;
int plen = paragraph.size();
while(st<plen)
{
if(ischa(st,paragraph))
{
int pos = 0;
string words = "";
for(;st+pos<plen;pos++)
{
if(ischa(st+pos,paragraph))
{
if(isupcha(st+pos,paragraph))
paragraph[st+pos] += 'a'-'A';
words += paragraph[st+pos];
}
else
break;
}
if(find(banned.begin(),banned.end(),words)==banned.end())
{
re[words]++;
//cout << words <<endl;
}
st += pos+1;
}
else
st++;
}
string rewords;
int renum = 0;
for(auto it=re.begin();it!=re.end();it++)
{
if((*it).second>renum)
{
renum = (*it).second;
rewords = (*it).first;
}
}
return rewords;
}
private:
unordered_map<string,int> re;
bool ischa(int a, string paragraph)
{
if((paragraph[a]>='a'&¶graph[a]<='z')||(paragraph[a]>='A'&¶graph[a]<='Z'))
return true;
else
return false;
}
bool isupcha(int a, string paragraph)
{
if(paragraph[a]>='A'&¶graph[a]<='Z')
return true;
else
return false;
}
};
最適化されたコードではそう見てみましょう
文字列と文字列処理関数は、レビューをストリーミング:
istringstream:
istringstream(文字列str)
新しい文字列ストリームが++、11 Cではありませんが、それは本当に非常に簡単に見過ごさが、非常に便利な機能が備えられています
文字列は、非常に容易になってきたように、区切り文字列として流れ空間は、完全な文字列は元の文字などによって考えることなくパーティションのような標準的な入力ストリームと同様小さいストリング、複数に分割されてもよいです手動で分離された内文字列要素
ctype.h:
ctype.hライブラリ関数は、実現することは困難ではないが、非常に巧妙な機能の多くを持っていないが、コードは非常に簡単になり、これらの機能をフルに活用することができ
これらの共通の機能があります。
isalphaは()確定した文字が文字である(ケース)
(ISNUMを用いて走査)文字の数か否かを判断します。
ispunct()文字は、特殊な記号であるか否かを判断します
islowerは()文字の小文字かどうかを決定します
文字が大文字であるかどうかを判断するisupper()
TOLOWER()変換は、小文字に文字を大文字
大文字と小文字TOUPPER()に変換します
C ++ 11の知識のレビュー:
オート:
自動的にタイプを決定、この機能は非常に簡単で、実際には、主要変数は、自分のタイプで定義されていませんが、コンパイラが自動的に変数に渡された値に基づいて決定することができます。この機能の主な利点は、このようなイテレータ宣言限り、変数の宣言は、あなたが長いイテレータ宣言を省略することができ、自動の使用は、コードは非常に明確かつ簡潔になりますシンプルに反映されています
にとって:
(:表現宣言)について
C ++ 11はまた、サイクルのためにアップグレードされているが、(;;)使用のための最も原始的な、使用と同様Pythonでループのために今も利用可能です。これは特に文字列操作は非常に便利になり、配列トラバーサルがになっています
あなたは、宣言の値を変更したい場合は、基準シンボルを追加することを忘れないでくださいことに注意してください
コードのアップグレード:
最初は、新しい機能を使用するための文字列プロセスはストリームを分離するためのスペースにすべての英数字以外の文字列を処理し、小文字の処理にすべて大文字意志であります
次いで、流れが均一な最終の決意コードを残して、まだでスロー各ワードunordered_mapのために、処理され、すべての受信処理後に決定した文字列に翻訳
コード全体を完了するために、単純な二段階は非常に明確で美しいなり、
コード:
/*
Author Owen_Q
*/
class Solution {
public:
string mostCommonWord(string paragraph, vector<string>& banned) {
for(auto &c: paragraph)
c = isalpha(c)? tolower(c): ' ';
istringstream iss(paragraph);
string words, rewords;
int renum = 0;
re.clear();
while(iss >> words)
{
if(find(banned.begin(),banned.end(),words)==banned.end())
{
re[words]++;
if(re[words]>renum)
{
renum = re[words];
rewords = words;
}
}
}
return rewords;
}
private:
unordered_map<string,int> re;
};