【问题标题】:Counting the string phrase in String Grid计算字符串网格中的字符串短语
【发布时间】:2019-05-21 16:55:47
【问题描述】:

给定一个 n*m 网格,其中包含小写英文字母。短语“saba”在网格中水平、垂直和对角出现了多少次?

水平、垂直和对角计数。

#include<iostream> 
#include <vector>
#include <string>
using namespace std;
int TotalCount(vector<string> Str, int ItemCount)
{
string Text = "saba";
string VerticalString = "";
string DiagonalOneString = "";
string DiagonalTwoString = "";
int count = 0;
for (int i = 0; i < ItemCount; ++i)
{
    string& currentRow = Str[i];
    VerticalString = VerticalString.append(&currentRow.at(0));
    DiagonalOneString = DiagonalOneString.append(&currentRow.at(i));
    DiagonalTwoString = 
    DiagonalTwoString.append(&currentRow.at(currentRow.length() - 1 - i));

    if ((currentRow.find(Text) != string::npos) || (VerticalString.find(Text) != string::npos) || (DiagonalOneString.find(Text) != string::npos) || (DiagonalTwoString.find(Text) != string::npos))
    {
        count++;
    }
}
return count;
}

int main()
{
int total = 0;
int row;
cin >> row;
vector<string> rows;
// read each row and append to the "rows" vector
for (int r = 0; r < row; r++)
{
    string line;
    cin >> line;
    rows.push_back(line);
}
cout << TotalCount(rows, row);
return 0;
}

输入格式

第一行:两个整数n和m,其中n表示(1

Sample Input
5 5
safer
amjad
babol
aaron
songs

Expected Output
2

看起来 VerticalString 复制了整个字符串,而不是复制指定位置的字符。我没有得到预期的计数。有人可以告诉我为什么计数会出错吗?

【问题讨论】:

  • 与您的问题无关,但您知道向量中的元素数量在向量本身中吗?它可以通过例如获得Str.size()?这意味着您不需要将向量的大小作为参数传递给函数调用。
  • 是的,对不起,我完全忘记了这一点。谢谢! :-)

标签: c++ string c++11 vector data-structures


【解决方案1】:

当您的垂直字符串为saba 时,count 将递增。但是当你的垂直字符串是sabas 时,count 将再次增加,对于相同的命中。

此外,您可能打算搜索对角线之外的两个角之间的对角线。仅查看 2 条对角线可以忽略有效命中。并且可能需要阅读两个方向。

我的建议是将问题分解为计算每个水平行的命中数、计算每个垂直行的命中数(可以转置矩阵并重新使用第一个函数)、计算对角线(从东北到西南),最后计算对角线(从西北到东南)。即,为每个人指定一个新函数,并对结果求和。

打印您正在测试的字符串也会极大地帮助您进行调试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多