代码随想录算法训练营Day8 字符串

字符串/字符数组

字符串的本质就是\(char\)类型的数组。关于字符串的处理,不同语言有一点点不一样。就我了解的,\(python\)的里面字符串是“不可变”的,所以他一般需要先转成列表,处理之后再回去;C++中的string本质是带终止符的字符数组。

所以我个人觉得,字符串的题目是另一类单独的专题,他跟普通的数组或者其他题目的思路不太一样,需要单独训练这个专题。

Leetcode 344. 反转字符串

题目链接:https://leetcode.cn/problems/reverse-string/description/

题目描述:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 \(s\) 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 \(O(1)\) 的额外空间解决这一问题。

题目解析:如果你对库函数比较熟,直接reverse就可以了。另一种写法是双向双指针,当然,因为双指针移动是对称的,直接使用单个指针也可以。

class Solution {
public:
    void reverseString(vector<char>& s) {
        // ranges::reverse(s);
        for (int i = 0; i < s.size() / 2; i ++) {
            std::swap(s[i], s[s.size() - 1 - i]);
        }
    }
};

Leetcode 541. 反转字符串 II

题目链接:https://leetcode.cn/problems/reverse-string-ii/submissions/657636073/

题目描述:给定一个字符串 \(s\) 和一个整数 \(k\),从字符串开头算起,每计数至 \(2k\) 个字符,就反转这 \(2k\) 字符中的前 \(k\) 个字符。

如果剩余字符少于 \(k\) 个,则将剩余字符全部反转。
如果剩余字符小于 \(2k\) 但大于或等于 \(k\) 个,则反转前 \(k\) 个字符,其余字符保持原样。

题目分析:考虑枚举。不难发现,需要反转的区间是$$[0, k),[k, k + k),[2k, 2k + k) ...[i, i + k)$$
所以我们考虑枚举所有区间的左边界。不难得到:

class Solution {
public:
    string reverseStr(string s, int k) {
        // 所有需要反转的区间:
        // [0, k)
        // [k, k + k)
        // ......
        // [i, i + k)
        // 而std默认的reverse函数刚好是开区间的,这符合我们的心意
        int n = s.size();
        for (int i = 0; i < n; i += 2 * k) {
            std::reverse(s.begin() + i, s.begin() + std::min(i + k, n));
        }
        return s;
    }
};

卡码网 54. 替换数字

题目链接:https://kamacoder.com/problempage.php?pid=1064

题目描述:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

题目分析:考虑枚举。可以构造一个答案字符串。如果是数字,那么ans += "number";反之,ans += s[i]

#include <bits/stdc++.h>

using u32 = uint32_t;

using i64 = int64_t;
using u64 = uint64_t;

using i128 = __int128;
using u128 = unsigned __int128;

using namespace std;

#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define Fd(i, a, b) for (int i = (a); i >= (b); i--)

#ifndef DEBUG
struct __X {
  __X& operator<<(const auto& str) { return *this; }
  void sp(const std::string& str = "") {}
} dout;
#define debug(x) ;
#endif

constexpr int mod = 998244353;
constexpr int MOD = 1E9 + 7;
constexpr int INF = 1E9;
constexpr int N = 2E5 + 10;

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  string s;
  std::cin >> s;
  for (auto& c : s) {
    if (isdigit(c)) cout << "number";
    else cout << c;
  }
}

/* By Tangzy
⠄⠄⠄⠄⢠⣿⣿⣿⣿⣿⢻⣿⣿⣿⣿⣿⣿⣿⣿⣯⢻⣿⣿⣿⣿⣆⠄⠄⠄
⠄⠄⣼⢀⣿⣿⣿⣿⣏⡏⠄⠹⣿⣿⣿⣿⣿⣿⣿⣿⣧⢻⣿⣿⣿⣿⡆⠄⠄
⠄⠄⡟⣼⣿⣿⣿⣿⣿⠄⠄⠄⠈⠻⣿⣿⣿⣿⣿⣿⣿⣇⢻⣿⣿⣿⣿⠄⠄
⠄⢰⠃⣿⣿⠿⣿⣿⣿⠄⠄⠄⠄⠄⠄⠙⠿⣿⣿⣿⣿⣿⠄⢿⣿⣿⣿⡄⠄
⠄⢸⢠⣿⣿⣧⡙⣿⣿⡆⠄⠄⠄⠄⠄⠄⠄⠈⠛⢿⣿⣿⡇⠸⣿⡿⣸⡇⠄
⠄⠈⡆⣿⣿⣿⣿⣦⡙⠳⠄⠄⠄⠄⠄⠄⢀⣠⣤⣀⣈⠙⠃⠄⠿⢇⣿⡇⠄
⠄⠄⡇⢿⣿⣿⣿⣿⡇⠄⠄⠄⠄⠄⣠⣶⣿⣿⣿⣿⣿⣿⣷⣆⡀⣼⣿⡇⠄
⠄⠄⢹⡘⣿⣿⣿⢿⣷⡀⠄⢀⣴⣾⣟⠉⠉⠉⠉⣽⣿⣿⣿⣿⠇⢹⣿⠃⠄
⠄⠄⠄⢷⡘⢿⣿⣎⢻⣷⠰⣿⣿⣿⣿⣦⣀⣀⣴⣿⣿⣿⠟⢫⡾⢸⡟⠄.
⠄⠄⠄⠄⠻⣦⡙⠿⣧⠙⢷⠙⠻⠿⢿⡿⠿⠿⠛⠋⠉⠄⠂⠘⠁⠞⠄⠄⠄
⠄⠄⠄⠄⠄⠈⠙⠑⣠⣤⣴⡖⠄⠿⣋⣉⣉⡁⠄⢾⣦⠄⠄⠄⠄⠄⠄⠄⠄
*/
posted @ 2025-08-29 19:55  Tangzy0121  阅读(480)  评论(0)    收藏  举报