2010-02-09 61 views
0
#include <iostream> 
#include <string> 
#include <algorithm> 
#include <cstdlib> 
#include <cstdio> 

using namespace std; 

static bool isanagram(string a, string b); 

int main(void) 
{ 
    int i,n,j,s; 
    cin >> n; 
    string a, b; 
    cin >> a >> b; 
    if(!isanagram(a,b)) cout << "False" << endl; 
    else cout << "True" << endl; 
    return 0; 


} 

static bool isanagram(string a, string b) 
{ 
    int i, j, size, s=0; 
    size = a.size(); 
    bool k; 
    for(i=0;i<size;i++) 
    { 
     k=false; 
     for(j=0;j<size;j++) 
     { 
      if(a[i] == b[j]) { k = true; break; } 
     } 
     if(k==true) s+=1; 
    } 
    cout << a[2] << b[2] << endl; 
    if(s == size) return true; 
    else return false; 

} 

我不知道問題到底在哪裏,所以我只是粘貼了整個代碼。布爾功能問題 - 總是返回true?

它應該是一個簡單的程序能夠找到兩個字符串是否是字謎,但它不工作,我不知道爲什麼。我在程序中使用了指針,所以認爲可能是問題,並刪除它們,我另外刪除了其他東西,但仍然無法正常工作。如果你可以給它一個看看,並告訴我一些想法,我可能會出錯我的代碼?

預先感謝您。

+0

如果您接受的答案多於目前爲止的答案,人們可​​能會回答。 – Oded 2010-02-09 15:54:46

+2

順便說一句,如果第二個字符串比第一個字符串短,您的代碼可能會崩潰。 – erelender 2010-02-09 15:57:44

+1

這是一個數字,在你的情況下是0%,這意味着你沒有接受任何你以前所有問題的答案。 – 2010-02-09 15:58:25

回答

0

首先要做的事:不要聲明方法static。這是一個令人困惑的關鍵字,在它可以完成的所有角色的最佳時間...因此,當你真的必須保留時間時(例如,類的方法或屬性不受任何實例限制)。

關於算法:你快到了,但只有存在是不夠的,你也需要考慮到字符數。

讓我們這樣做只是:

bool anagram(std::string const& lhs, std::string const& rhs) 
{ 
    if (lhs.size() != rhs.size()) return false; // does not cost much... 

    std::vector<int> count(256, 0); // count of characters 
    for (size_t i = 0, max = lhs.size(); i != max; ++i) 
    { 
    ++count[lhs[i]]; 
    --count[rhs[i]]; 
    } 

    for (size_t i = 0, max = count.size(); i != max; ++i) 
    if (count[i] != 0) return false; 

    return true; 
} // anagram 

讓我們來看看它是怎麼工作:anagram("abc","cab")

  1. 初始化:count = [0, 0, ...., 0]
  2. 第一循環i == 0>['a': 1, 'c': -1]
  3. 第一循環i == 1>['a': 0, 'b': 1, 'c': -1]
  4. 第一圈i == 2>['a': 0, 'b': 0, 'c': 0 ]

而第二個循環將通過沒有任何問題。

變體包括維護2個計數數組(每個字符串一個),然後比較它們。它效率稍低......不過並不重要。

int main(int argc, char* argv[]) 
{ 
    if (argc != 3) std::cout << "Usage: Program Word1 Word2" << std::endl; 
    else std::cout << argv[1] << " and " << argv[2] << " are " 
       << (anagram(argv[1], argv[2]) ? "" : "not ") 
       << "anagrams" << std::endl; 
} 
3

它並不總是返回true:

這裏是我輸入:

0 
sdf 
fda 

這裏的輸出我:

fa 
False 

關於你的任務:如果性能是不是你的任務問題,只需排序2個字符串(使用std :: sort)並比較結果。

關於你的風格:

  • 使用字符串長度::(),而不是大小() - 這是更地道
  • ,而不是if(s == size) return true; else return false;考慮return s == size
  • 通過const引用傳遞的字符串,而不是通過值
  • 考慮聲明變量儘可能接近它們的使用點(但不是密切相關),並在聲明(i,j,k,尺寸都符合此提示時)時將它們初始化它們
+1

爲什麼'string :: length'更習慣(儘管不那麼通用)? – UncleBens 2010-02-09 17:23:20

3

你的二叉函數的邏輯是致命的錯誤 - 即使你設法解決它中的錯誤,它也不會正常工作。

在開始編碼之前,您需要確保您擁有正確的算法。一個簡單的算法可能是:

  • 不大不小的
  • 排序b
  • isanagram =(A == B)
2

基本上有檢查字謎的方式有兩種:

  1. 對兩個字符串進行排序並查看它們是否匹配。如果它們是字形,它們將具有相同的字母,並且將按照相同的順序排序。

  2. 計算每個字符串中每個char的頻率。如果它們是字典,則每個字符串的頻率計數對於每個字符串都是相同的。

0

我發現你的代碼存在一些問題。基本上算法是錯誤的。它將匹配a.size()中的字符。它不考慮重複項(在a或b中)。

本質上,你應該排序字符串,然後比較相等。

如果你不能排序,至少從比較中刪除b個字符,消除k變量。

2

你的方法很好,但它有一個小缺陷。確保字符串a中的每個字符都存在於字符串中。所以如果a =「aab」和b =「abc」,你的方法會將它們標記爲anagram。你還需要考慮char的數量。

anagram的定義是:

字謎是一類的文字遊戲,重新安排一個單詞或短語的字母來產生一個新的單詞或短語的結果,全部採用原信恰好一次;

許多人建議的最簡單的方法是確保字符串的長度相同。如果是,請對兩個字符串進行排序並檢查是否相等。

如果你想修補你的方法,你可以使字符串b中的字符與空字符串a中的字符匹配後爲NULL。

喜歡的東西:

if(a[i] == b[j]) { b[j] = 0; k = true; break; } 

在你的位置:

if(a[i] == b[j]) { k = true; break; } 

這樣一次B的字符已經匹配就不能再次參與。

+0

如果兩個字符串在排序前是相同的,他們是否是字謎?你引用的定義是一個*新的單詞或短語*,這意味着在排序之前字符串必須是不同的。此外,應該刪除空格,但這取決於作業分配的要求。 – 2010-02-09 17:44:11