题解:洛谷 AT_abc427_a ABC - AC

【题目来源】

洛谷:AT_abc427_a [ABC427A] ABC -> AC - 洛谷

【题目描述】

给定一个只包含大写英文字母的字符串 \(S\),其中 \(S\) 的长度为奇数。

请输出将 \(S\) 的中间字符删除后得到的字符串。\(S\) 的中间字符为第 \(\frac{L+1}{2}\) 个字符,其中 \(L\)\(S\) 的长度。

【输入】

从标准输入中读入一行,格式如下:

\(S\)

【输出】

输出根据题目要求处理后的字符串。

【输入样例】

ABCDE

【输出样例】

ABDE

【核心思想】

  1. 问题分析:给定长度为奇数 \(L\) 的字符串 \(S\),需要删除其中间字符(第 \(\frac{L+1}{2}\) 个字符),输出删除后的字符串。这是一个字符串切片/直接模拟问题,关键在于准确定位中间字符并拼接前后两部分。

  2. 算法选择

    • 字符串切片:将字符串分为前半部分 \([1, \frac{L}{2}]\) 和后半部分 \([\frac{L+1}{2}+1, L]\),跳过中间字符后直接拼接输出
  3. 关键步骤

    • 读取输入:读入字符串 \(S\),在 \(S\) 前补空格使下标从 \(1\) 开始
    • 计算长度\(n = |S|\)
    • 输出前半部分:遍历 \(i\)\(1\)\(n/2\)(整数除法),输出 \(S[i]\)
    • 输出后半部分:遍历 \(i\)\((n+1)/2 + 1\)\(n\),输出 \(S[i]\)
    • 换行结束
  4. 时间/空间复杂度

    • 时间复杂度:\(O(L)\),遍历输出 \(L-1\) 个字符
    • 空间复杂度:\(O(L)\),存储字符串
  5. 字符串切片的核心思想

    • 奇数长度对称性:中间字符位置为 \(\frac{L+1}{2}\),前半部分长度为 \(\frac{L-1}{2}\),后半部分同样,保证删除后字符串长度为 \(L-1\)(偶数)
    • 下标偏移技巧:在字符串前补空格使下标从 \(1\) 开始,避免 \(0\)-based 与 \(1\)-based 的混淆
    • 适用于"按位置删除/提取子串"类基础字符串操作问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;

string s;  // 存储输入的字符串

int main()
{
    // 输入字符串
    cin >> s;

    // 获取字符串长度
    int n = s.size();

    // 在字符串前添加空格,使索引从1开始(便于处理)
    s = " " + s;

    // 输出前半部分(不包括中间字符)
    // 从第1个字符到第n/2个字符
    for (int i = 1; i <= n / 2; i++)
    {
        cout << s[i];
    }

    // 输出后半部分(不包括中间字符)
    // 从中间字符的下一个位置到字符串末尾
    for (int i = (n + 1) / 2 + 1; i <= n; i++)
    {
        cout << s[i];
    }

    cout << endl;

    return 0;
}

【运行结果】

ABCDE
ABDE
posted @ 2026-08-27 11:03  团爸讲算法  阅读(9)  评论(0)    收藏  举报