西北工业大学ACM基地2022年大培训试题题解:第四周B题

问题描述

给定一个字符串S,判断其是否为回文串

(回文串:正着读和反着读一样)

输入

输入为1行,字符串S

1<=|S|<=100000

S均由小写字母组成

输出

输入为1行,若是回文串,则输出YES,否则输出NO

输入样例 1

aabaa

输出样例 1

YES

题解

解法1

利用char c,逐个字符读入字符串,并存入动态数组。正反验证。

源代码

// UOJ W4-D
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    char c;
    vector<char> cv;
    bool flag = 1;
    while (c = getchar()) //读取字符串
    {
        if (c == '\0')
            break;
        else
            cv.push_back(c);
    }

    for (int i = 0; i <= (cv.size() + 1) / 2; i++)
    {
        if (cv[i] != cv[cv.size() - 1 - i])
            flag = 0;
    }
    if (flag == 1)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}

分析

Windows运行正常。

OJ运行时错误。

解法2

将char c改为string c,一次性读入字符串,并存入动态数组。正反验证。

源代码

// UOJ W4-D
#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    string c;
    cin >> c;
    vector<char> cv;
    bool flag = 1;
    for (auto i : c)
    {
        cv.push_back(i);
    }

    for (int i = 0; i <= (cv.size() + 1) / 2; i++)
    {
        if (cv[i] != cv[cv.size() - 1 - i])
            flag = 0;
    }
    if (flag == 1)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}

分析

Windows运行正常。

OJ运行正常。

总结

UOJ系统的输入不包含回车,无法以'\n'作为结束标志,字符串结尾没有'\0'。

如何利用解法1过OJ待查。

Last modification:November 21, 2022
如果觉得我的文章对你有用,请随意赞赏~