当前位置: 首页 > web >正文

【算法笔记】如何优雅的进行字符串操作

最近的CCCC天梯赛又出了非常恶心的字符串题~
在编程竞赛(特别是CCCC天梯赛)中,字符串操作类题目往往看似简单却暗藏陷阱。本文将以Python、Java、C++ 三剑客为例,总结高频字符串操作的优雅实现方案,助你快速攻克字符串类难题。


一、子串替换:精准狙击第一个目标

需求描述
将字符串中第一个出现的子串A替换为子串B,若A不存在则保持原字符串。

Python

def replace_first_substring(s, A, B):return s.replace(A, B, 1)  # 第三个参数控制替换次数# 示例:将首个"apple"换为"orange"
print(replace_first_substring("apple banana apple", "apple", "orange"))  # orange banana apple

Java
方案一:正则安全版(避免特殊字符干扰)

import java.util.regex.*;public class StringUtils {public static String replaceFirstSubstring(String str, String A, String B) {return str.replaceFirst(Pattern.quote(A), Matcher.quoteReplacement(B));}
}// 示例:替换首个包含正则符号的字符串
System.out.println(replaceFirstSubstring("a+b*c", "+b*", "-"));  // a-c

方案二:高效直操作版

public static String replaceFirstSubstring(String str, String A, String B) {int index = str.indexOf(A);return index != -1 ? str.substring(0, index) + B + str.substring(index + A.length()) : str;
}

C++

#include <string>
using namespace std;string replace_first_substring(string str, const string& A, const string& B) {size_t pos = str.find(A);if (pos != string::npos) {str.replace(pos, A.length(), B);}return str;
}// 示例:替换首个"cpp"
cout << replace_first_substring("cpp python cpp", "cpp", "C++");  // C++ python cpp

二、删除操作:定点清除与精确爆破

场景一:删除首个指定子串
Python

def delete_first_substring(s, A):return s.replace(A, "", 1)  # 第三个参数控制删除次数print(delete_first_substring("test_test", "test"))  # _test

Java

public static String deleteFirstSubstring(String str, String A) {int index = str.indexOf(A);return index != -1 ? str.substring(0, index) + str.substring(index + A.length()) : str;
}// 示例:删除首个"bug"
System.out.println(deleteFirstSubstring("bug1 bug2", "bug"));  // 1 bug2

C++

string delete_first_substring(string str, const string& A) {size_t pos = str.find(A);if (pos != string::npos) {str.erase(pos, A.length());}return str;
}

场景二:删除指定索引字符
Python

s = "012345"
s = s[:3] + s[4:]  # 删除索引3的字符
print(s)  # 01245

Java

String str = "ABCDEF";
String newStr = str.substring(0, 2) + str.substring(3);  // 删除索引2
System.out.println(newStr);  // ABDEF

C++

string str = "Hello!";
str.erase(5, 1);  // 删除索引5的字符(!)
cout << str;  // Hello

三、切片操作

截取区间 [start, end) 的子串
Python

s = "abcdef"
print(s[2:5])  # cde (索引2到4)

Java

String str = "ABCDEF";
String sub = str.substring(1, 4);  // 索引1到3
System.out.println(sub);  // BCD

C++

string str = "123456";
string sub = str.substr(2, 3);  // 从索引2开始取3个字符
cout << sub;  // 345

四、字符串翻转:镜像世界的魔法

Python

s = "hello"
reversed_str = s[::-1]  # 切片步长-1实现反转
print(reversed_str)  # olleh

Java

String str = "reverse";
String reversed = new StringBuilder(str).reverse().toString();
System.out.println(reversed);  // esrever

C++

string str = "CPP";
reverse(str.begin(), str.end());  # 原地反转
cout << str;  // PPC

关键点总结

操作类型Python优势Java技巧C++特性
替换replace次数控制正则转义防陷阱find+replace链式操作
删除空替换复用逻辑indexOf边界检查erase精准清除
切片[start:end]极简语法双参数substringsubstr起始位置+长度
翻转负步长切片StringBuilder工具类reverse算法直接修改

避坑指南

  1. Java的substring索引陷阱
    str.substring(a, b) 的结束索引是独占的(即包含a不包含b),与Python切片行为一致

  2. C++的substr参数特殊性
    第二个参数表示截取长度而非结束位置,需特别注意 str.substr(2, 3) 表示从索引2开始取3个字符

  3. 正则敏感字符处理
    当替换内容包含 $\ 等特殊符号时,Java必须使用 Matcher.quoteReplacement

http://www.xdnf.cn/news/718.html

相关文章:

  • 【英语语法】词法---形容词
  • 关于编译树莓派内核系统的总结
  • STM32基础教程——串口收发
  • 基于尚硅谷FreeRTOS视频笔记——11—RTOS获取源码及源码简介
  • 开发环境解决浏览器层面跨域问题
  • [Scade One] Swan 图形化建模技术的形式化文法
  • 如何快速的搭建可用的付费网盘站点,实现盈利:新版网盘系统源码,全新构架,局部新颖,功能齐全,可自用可运营,可正常用于生产,2025年搭建付费网盘系统首选!
  • python绘制正态分布和t分布图形
  • Spring 事务管理核心机制与传播行为应用
  • Keil MDK 编译问题:function “HAL_IncTick“ declared implicitly
  • 牛客java练习题
  • OpenCV 图像调整指南
  • CSS 预处理器:Sass 升级版本 浅学
  • Edge Impulse 训练openMV分类模型(字母+数字)
  • AnimateCC基础教学:制作一个打地鼠简化版
  • 第37讲|AI+农业气象建模:预测极端天气对农业的影响
  • Linux 动、静态库的实现
  • 【代码解读】开源模型 minimind之pretrain
  • Java29:Spring MVC
  • 认识MCP Function Calling AI Agent
  • Redis——内存策略
  • 对于网络资源二级缓存的简单学习
  • 第十章 继承与派生
  • C++ 构造函数调用顺序以及什么是虚析构函数?为什么需要它?
  • Ubuntu下安装和卸载MySQL
  • 简单使用MCP
  • PCA 降维实战:从原理到电信客户流失数据应用
  • 一键升级OpenSSH/OpenSSL修复安全漏洞
  • 【LINUX操作系统】线程基础与分页式存储管理
  • C++初阶-类和对象(中)