【问题标题】:Duplicates using while loop and search algorithm使用 while 循环和搜索算法重复
【发布时间】:2018-04-08 13:45:53
【问题描述】:
for (int j = 0; j < messageVector.size(); j++)
{
    for (int i = 0; i < bookVector.size(); i++)
    {
        size_t offset = 0;
        while ((offset = bookVector[i].find(messageVector[j], offset)) != string::npos)
        {
                cout << "Found " << messageVector[j] << " at " << i << "," << offset << std::endl;
                ++offset;
        }
    }
}

我在使用此代码时遇到的问题是,如果 bookvector 包含重复的字母,则该字母将在两个位置都打印两次。因此,如果 messageVector 包含消息“test”但 bookvector 包含带有额外 t 的字母表,则输出将是:在 i 处找到 t,偏移两次,然后是消息的其余部分。这不一定是个问题,但我希望重复的字母只打印一次,其中包含一组随机坐标,其中发现选择了 t。

我在想一种方法来解决这个问题,我基本上是用伪代码完成的,我打算得到所有具有相同字符的行和偏移量,把它们放在一个容器中,随机选择一个。将找到的位置与字符一起打印到控制台,清除容器并移动到下一个字母并重新开始。但是我不知道在 while 循环中在哪里执行此操作。如果有人可以帮助我完成它,那就太好了。

样本输出是

Found H at 1,0
Found H at 3,9
Found E at 0,4
Found L at 1,4
Found L at 1,4
Found O at 1,7  

bookVector 是

ABCDE FG, 海克伦诺, PQRSTUVWXYZ, TDASDGKSDH

MessageVector 是 H,E,L,L,O

【问题讨论】:

  • 所以你的问题是 bookVector 是否包含重复的字母?找到第一个匹配项后立即使用 bool 结束 while 和内部 for 循环,或者将您的 bookVector 复制到一个集合中,这将消除重复项,并使用它而不是 bookVector
  • 我不能使用集合,因为 bookVector 是行向量,如果我将 bookVector 放入集合中,它不会删除重复的字符而是重复的行。我需要行向量来跟踪字符的行号和偏移量
  • 然后在找到第一个匹配项时退出
  • 我应该在哪里休息,休息的标准是什么。我试着做 if oldoffset == offset 和 if oldrow == j then break 但它似乎没有用
  • 在内部 for 循环之前声明一个 bool 变量:bool found = false;。内部 for 循环条件变为 i &lt; bookVector.size() &amp;&amp; !found。在 while 循环内部,found = true; break;

标签: c++ vector containers


【解决方案1】:

你应该跟踪你已经找到的字母,这可以通过使用 在寻找字母之前检查它在集合中,如果存在你可以跳过这个字母。如果没有将其添加到集合中并开始查看 bookVector。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 2012-07-03
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多