【问题标题】:Trying to find isogram in a string c++试图在字符串c ++中找到等图
【发布时间】:2020-06-30 06:55:27
【问题描述】:

我正在尝试编写具有两个功能的代码:一个确定字符串是否为 isogram,另一个用于将结果(真或假)打印到控制台(用于解决任务的目的)。

虽然有些事情无法正常工作。而且我想知道我需要在哪里改进代码(可能全部......)。我会很感激任何建议:)

#include <iostream>
#include<string>
#include<bits/stdc++.h>
#include<iomanip>


bool find_Isogram (std::string str)
{
std::sort(str.begin(), str.end()); //sorted the string for the for loop (e.g. eHllo)

 int length = str.length();

 for (int i = 0; i < length; i++)
    {
    if (str.at(i) == str.at(i+1))
        {
            return false;
            break;
        }
    else
    {
        return true;

    }
}
}

void print_result()
{
     std::string str;
     if (!find_Isogram (str))
     {
      std::cout << "false" << std::endl;
     }

else
{
   std::cout << "true" << std::endl;
}

}

int main()
{

find_Isogram ("gdtub");
print_result();


return 0;

};
````````````````````````````````````````````````````

【问题讨论】:

  • 另外,在return 之后不需要break
  • 添加到@ΦXocę 웃 Пepeúpa ツ 的帖子,你认为你的程序会对输入ABA 做什么?
  • 等值线是一个不包含重复字母的单词,例如'等值线' :)
  • 请告诉我们什么“事情不正常”以及您如何发现它们没有正常工作。例如向我们展示输入、预期和实际输出。
  • 例如,如果我输入“tree”,我希望它返回 false,因为“tree”不是等值线。这基本上就是我需要知道的全部内容。我使用了头文件,因为我尝试了在论坛中检查想法时发现的不同方法。不,说实话,我不太了解那个头文件;)还在学习......

标签: c++ string for-loop


【解决方案1】:

这里有一些问题:

1) 你总是检查一个空字符串:

print_result 只会检查一个空字符串,但无论如何它都是多余的。

void print_result()
{
     std::string str;         // empty string
     if (!find_Isogram (str)) // finding isogram on empty string
     {
         std::cout << "false" << std::endl;
     }
     ...
}

可以使用std::boolalpha 简化它,它允许您将bool 打印为"true""false"(而不是1 或0)。 main 会变成

int main()
{
    std::cout << std::boolalpha << find_Isogram ("gdtub"); // prints true or false
};

2) Isogram 检查总是在第一个字符之后结束

查看find_Isogram 中的条件。它在if else 中有一个return 语句,因此您总是在检查第一个字符后返回。 以这种方式检测重复字符的想法是正确的(除了其他人已经提到的错误)。但是你想return true; 只有在检查了 all 的字符之后,例如循环外:

bool find_Isogram (std::string str)
{
    std::sort(str.begin(), str.end()); //sorted the string for the for loop (e.g. eHllo)

    int length = str.length();

    for (int i = 0; i < length - 1; i++)
    {
        if (str.at(i) == str.at(i+1))
        {
            return false; // whoops duplicate char, stop here
        }
    }    
  
    return true; // no duplicates found, it's an isogram
}

对于一些进一步的 C++ 魔法,您可以使用标准库函数进一步简化它:D
bool find_Isogram (std::string str)
{
    std::sort(str.begin(), str.end());
    return std::unique(str.begin(), str.end()) == str.end();
}

【讨论】:

  • 谢谢大家!终于在用那段代码“玩弄”了几个小时后,它可以工作了,我可以睡得更好:)
  • 使用end函数进行检查。很好的主意。嗯,unique 是否返回相同的容器(不像擦除复制要保存在不同容器中的元素并返回该容器)?
  • @d4rk4ng31 std::unique 仅对已排序的容器起作用,方法是移动元素以使唯一元素位于开头。然后它返回一个迭代器到第一个非唯一元素(那里的参考更详细)。如果此迭代器是结束迭代器,则意味着只有唯一元素:)
【解决方案2】:

检查连续字符是否相等的条件是错误的。对于ABAB 之类的字符串,它将为真。相反,您需要使用包含每个已出现字符计数的地图。

类似:

std::map<char, int> map_of_chars;
for(int i = 0; i < length; i++) {
    map_of_chars[str.at(i)] = map_of_chars[str.at(i)] + 1;
}

如果地图中的任何值大于1,则返回false;

另一个实现是使用std::unique()的返回值:

std::sort(str.begin(), str.end());
auto intial_size = str.size();
std::unique(str.begin(), str.end());
if(str.size() == initial_size) {
    /is an isogram
}
else {
    //is not an isogram
}

【讨论】:

  • 感谢您的想法。困扰我的是,这个挑战似乎很“容易”,但对我来说,为这段代码实现不同的功能(独特的、...的映射)并不“容易”:)
  • 嗯...我建议您使用unique 实现。这很容易:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2021-03-27
相关资源
最近更新 更多