力扣LCR182:字符串操作三连 从基础拼接到底层指针优化
题目重解
需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。
解题思路
1.基础拼接法(注释部分):创建新字符串,分两次遍历拼接

2.指针优化法(注释部分):利用指针直接获取子串

3.最终方案:通过字符串扩容和指针操作实现原地修改,通过resize扩容后,使用指针直接操作内存,避免了额外的字符串拷贝,最优的空间优化方案。

代码:
class Solution {
public:
string dynamicPassword(string password, int target) {
/* 方案1:基础拼接法
string s = ""; // 创建空字符串
// 先拼接target之后的部分
for (int i = target; i < password.size(); i++) {
s += password[i]; // 逐个字符追加
}
// 再拼接target之前的部分
for (int i = 0; i < target; i++) {
s += password[i]; // 逐个字符追加
}
return s; // 返回拼接结果
*/
/* 方案2:指针优化法
string s = ""; // 创建空字符串
char* s1 = &password[target]; // 获取target位置指针
s = s1; // 直接赋值后半部分
// 拼接前半部分
for (int i = 0; i < target; i++) {
s += password[i]; // 逐个字符追加
}
return s; // 返回结果
*/
// 方案3:原地修改法
int a=password.size(); // 获取原长度
password.resize(a+target); // 扩容字符串
char* s1 = &password[target]; // 定位分割点
char* s2 = s1; // 保存结果起始位置
s1 += a-target; // 定位到扩容区域
// 将前target字符移到扩容区
for (int i = 0; i < target; i++) {
*s1 = password[i]; // 直接内存操作
s1++;
}
return s2; // 返回新字符串
}
};原创内容 转载请注明出处






