2010-02-09 55 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