[英]bool function problem - always returns true?
#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
sdf
fda
這是我得到的輸出:
fa
False
關於您的任務:如果性能不是您的任務,只需對2個字符串排序(使用std :: sort)並比較結果即可。
關於您的風格:
if(s == size) return true; else return false;
if(s == size) return true; else return false;
考慮return s == size
isanagram函數的邏輯存在致命缺陷-即使您設法修復其中的錯誤,也永遠無法正常工作。
在開始編碼之前,需要確保您具有正確的算法。 一種簡單的算法可能是:
基本上有兩種檢查字謎的方法:
對兩個字符串進行排序,看看它們是否匹配。 如果它們是字謎,它們都將具有相同的字母,並且排序會將它們排序為相同的順序。
計算每個字符串中每個char
的頻率。 如果它們是字謎,則兩個字符串的每個char
的頻率計數將相同。
您的方法很好,但有一個小缺陷。 您確保字符串a中的每個字符都存在於字符串中。 因此,如果a =“ aab”和b =“ abc”,則您的方法會將其標記為anagram。 您還需要考慮char的計數。
字謎的定義是:
字謎是一種文字游戲,是重新排列一個單詞或短語的字母以產生一個新單詞或短語的結果,而所有原始字母恰好使用一次 ;
許多人建議的最簡單方法是確保字符串長度相同。 如果是,請對兩個字符串進行排序並檢查是否相等。
如果要修補方法,則可以將字符串b中的char與字符串a中的char匹配后將其設為NULL。
就像是:
if(a[i] == b[j]) { b[j] = 0; k = true; break; }
代替您的:
if(a[i] == b[j]) { k = true; break; }
這樣,一旦匹配了b的一個字符,便無法再次參與。
我發現您的代碼存在一些問題。 基本上,算法是錯誤的。 它將匹配a.size()中的字符。 它不考慮重復項(在a或b中)。
本質上,您應該對字符串進行排序,然后比較是否相等。
如果無法排序,請至少從比較中刪除b個字符,然后消除k變量。
首先,不要將方法聲明為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")
count = [0, 0, ...., 0]
i == 0
> ['a': 1, 'c': -1]
i == 1
> ['a': 0, 'b': 1, 'c': -1]
i == 2
> ['a': 0, 'b': 0, 'c': 0 ]
第二個循環將順利通過。
變體包括維護2個count數組(每個字符串一個),然后進行比較。 它的效率略低...雖然並不重要。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.