2016-07-18 15 views
-1

私はかなりプログラミングが慣れています。私は正確に同じ要素を持っているが異なる順序で2つの文字列を比較する必要がある。私はstrcmpi()を使って比較しようとしましたが、うまくいきません。私はis_permutation()を使って試しましたが、ネットで読み込んだ文字列は同じ要素と比較するのに使われましたが、私のコンパイラは<algorith.h>を含んでいてもそれが存在しないと言っています。私のコンパイラはBorland C++です。 2つの文字列を比較して同じ要素と等しいと評価されますが、異なる順序で配置される他の方法はありますか?例えば、"evil"および"vile"C++の文字列を比較すると、文字は同じでも順序は異なります。

+13

'std :: sort'と比較します。 – NathanOliver

+3

各文字列の文字を並べ替えることができます。 –

+2

」は標準ヘッダではなく、「」でもありません。 C++ヘッダーの[reference](http://en.cppreference.com/w/cpp/header)は、あなたに多くのことを伝えます。とにかく、Borlandでもアルゴリズムをサポートしているのかどうかは分かりませんが、基本的に 'std :: is_permutation'を何らかの形で再開発しなければなりません。 – chris

答えて

2
  1. コンパイラは古いです。私はチェックしませんでしたが、確かに、それはstd::is_permutationに必要なC++ 11をサポートしていません。

  2. コメントはすでに指摘されているので、文字列をsortとするだけで比較できます。

  3. コメントにも指摘されているように、あなたがインクルードしようとしているヘッダーは標準ではない/正しくありません(これはおそらく古代コンパイラを使用しているためです - VS2015、GCC 6.1、 3.8は無償で提供され、すべてがC++ 11/C++ 14サポートを提供します)。

+0

VS2015は無料ではありません。 – Dani

+0

コミュニティエディションは、個人的には無料です。 –

+0

「個人使用のために無料」!=「無料」。私はstackoverflowのユーザーのほとんどが個人的なプログラマーではないと思います。 – Dani

1

ネイサン・オリバーが示すように、2を並べ替えると、彼らが等しいかどうかを確認します。ソースコードは次のとおりです。

#include <iostream> 
#include <string> 
#include <algorithm> 
using namespace std; 

bool AreAnagrams(string s1, string s2) { 
    sort(s1.begin(), s1.end()); 
    sort(s2.begin(), s2.end()); 
    return s1 == s2; 
} 

int main() { 
    if (AreAnagrams("evil", "vile")) 
     cout << "Are anagrams." << endl; 
    else 
     cout << "Are not anagrams." << endl; 
    return 0; 
} 
+0

ありがとうございます。私は試してみます – james

2

あなたは、彼らはその後、trueを返すと等しいなら、それぞれの文字は、各文字列に表示された回数をカウントすることができます。

#include <iostream> 
#include <string> 
using namespace std; 

bool anagrams(string s, string t){ 

    if(s.length() != t.length()) 
     return false; 

    int chArr[256]; 
    // Set character's count to 0 
    for(int i=0; i<256; i++) 
     chArr[i] = 0; 

    for(int i=0; i<s.length(); i++){ 
     chArr[s[i]]++; 
     chArr[t[i]]--; 
    } 

    for(int i=0; i<256; i++){ 
     if(chArr[i] != 0) 
      return false; 
    } 

    return true; 
} 

int main(){ 
    if(anagrams("hello, olelh")) 
     cout << "Yes" << endl; 
    else 
     cout << "No" << endl; 
    return 0; 
} 
+0

このソリューションは私が好むものですが、Nathan Oliverのソリューションよりも多くのスペースが必要です。あなたの答えをstd :: unordered_mapを使用するように更新することをお勧めします。 – Taztingo

+0

ありがとうございます。私はそれを試してみます。 – james

関連する問題