gpt4 book ai didi

c++ - 字谜检测方法c++。将字符串转换为 ascii 值时出现问题

转载 作者:行者123 更新时间:2023-11-30 05:19:26 25 4
gpt4 key购买 nike

对于任何可以帮助我解决这个问题的人。我正在创建一个方法来比较两个字符串并检测它们是否是变位词。变位词是两个具有相同字母的字符串,尽管它们的顺序可能不同。例如“listen”和“iltsen”是变位词。

我决定将字符串分解为字符数组。我知道它工作正常,因为我在每个数组元素上使用 cout 对其进行了测试。接下来是哪里出错了。我尝试使用每个字符的 ASCII 值并将其添加到每个数组的变量中。这意味着如果值匹配,那么它们一定是一个变位词。

然而,由于未知原因,它无法正常工作。我发现它正在为一个数组而不是另一个数组读取索引 0 两次。我很困惑,无法理解。我完全不知道这是怎么回事。我尝试了多种不同的解决方案,但没有找到问题所在。如果有人知道这里发生了什么,我将不胜感激。

-谢谢!

#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
#include <iomanip>
#include <cctype>
#include <vector>
using namespace std;

bool isAnagram(string s1,string s2)
{

static char firstString[] = { 'c' };
static char secondString[] = { 'c' };
int size = s1.length();
static int count1 = 0;
static int count2 = 0;
cout << s1 << endl;
cout << s2 << endl;
if (s1.length() == s2.length())
{
for (int i = 0; i < size; i++)
{
firstString[i] = s1.at(i);
cout << i;
}
for (int i = 0; i < size; i++)
{
secondString[i] = s2.at(i);
cout << i;
}
cout << endl;

for (int i = 0; i < size; i++)
{
count1 = count1 + (int)firstString[i];
cout << "first" << i << ": " << firstString[i] << " = " << (int)firstString[i] << endl;
count2 = count2 + (int)secondString[i];
cout << "second" << i << ": " << secondString[i] << " = " << (int)secondString[i] << endl;
}
cout << count1 << " and " << count2 << endl;
if (count1 == count2)
return true;
}
else
return false;

count1 = 0;
count2 = 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
static char end;
do
{
string s1;
string s2;

cout << "Please enter the first string: ";
cin >> s1;
cout << endl << "Please enter the second string: ";
cin >> s2;

bool result = isAnagram(s1, s2);
static string resultString;

if (result == true)
resultString = "True";
else
resultString = "False";

cout << endl << "Anagram test result: " << resultString << endl;
cout << endl << "enter E for end or any other key to run again: ";
cin >> end;
cout << "----------------------------------------" << endl;
} while (end != 'e' && end != 'E');

return 0;
}

最佳答案

在您的情况下使用静态变量没有用,没有它们您将不需要 isAnagram 的最后两行。将两个字符串都存储在 char 数组中也是无用的,因为您可以在第三个循环中直接使用它们(而且您正在溢出大小为 1 的缓冲区)

for (int i = 0; i < size; i++)
{
std::cout << count1 << " ";
count1 = count1 + (int)s1.at(i);
cout << "first" << i << ": " << s1.at(i) << " = " << (int)s1.at(i) << endl;
count2 = count2 + (int)s2.at(i);
cout << "second" << i << ": " << s2.at(i) << " = " << (int)s2.at(i) << endl;
}

此外,您不能通过比较 ASCII 值的总和来说 2 个字符串确实包含相同的字母,这就像说 3 + 4 与 2 + 5 相同,因为两者都给出 7。你可以创建一个包含 52 个 int 的数组,每个元素都是它自己字母的计数器,然后你可以用一个循环遍历两个字符串,其中第一个字符串的每个字母都在递增它的元素数组和第二个字符串字母是递减元素。

if (s1.length() != s2.length())
return false;

std::vector<int> counts(52);

for (unsigned int i = 0; i < s1.length(); ++i)
{
++counts[s1[i] - (s1[i] < 91 ? 65 : 71)];
--counts[s2[i] - (s2[i] < 91 ? 65 : 71)];
}

确保数组初始化为0。最后,您需要遍历数组,如果其中一个元素不为 0,则它不是 anagram,否则返回 true。

for (unsigned int i = 0; i < 52; ++i)
if (counts[i] != 0)
return false;

return true;

关于c++ - 字谜检测方法c++。将字符串转换为 ascii 值时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com