簡體   English   中英

bool函數問題-始終返回true?

[英]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)並比較結果即可。

關於您的風格:

  • 使用string :: length()而不是size()-這更習慣
  • 而不是if(s == size) return true; else return false; if(s == size) return true; else return false; 考慮return s == size
  • 通過const引用傳遞字符串,而不是通過值傳遞字符串
  • 考慮將變量聲明為盡可能接近變量的用法(但不緊密),並在聲明時對其進行初始化(i,j,k,大小均符合此提示)

isanagram函數的邏輯存在致命缺陷-即使您設法修復其中的錯誤,也永遠無法正常工作。

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

  • 排序一個
  • 排序b
  • 等軸圖=(a == b)

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

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

  2. 計算每個字符串中每個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")

  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個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM