当前位置:首页 > 力扣 > 力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化

5个月前 (05-15)

题目重解

需要将密码字符串从第target个字符开始进行重新排列,形成新的动态密码。例如输入"password"和target=3,结果应为"swordpas"。


解题思路

1.基础拼接法(注释部分):创建新字符串,分两次遍历拼接

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第1张

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

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第2张

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

力扣LCR182:字符串操作三连 从基础拼接到底层指针优化 力扣 C++ 算法 字符串 指针 第3张

代码:

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; // 返回新字符串
    }
};



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

力扣740.删除并获得点数 预处理与动态规划的巧妙融合

题意解析:给定一组数字,每当你选择一个数字x时,所有等于x-1和x+1的数字都会被自动移除。你需要通过巧妙的选择顺序,最大化获得的点数总和。这个问题可以转化为对离散化数字分布的动态规划问题——将相邻数...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

力扣3112题解法:带时间限制的最短路径问题解析(C++代码)

一、题目解读力扣3112题要求解决带时间限制的最短路径问题:给定一个有向图,节点具有消失时间,需计算从起点到各节点的最短路径,且路径总时间不能超过节点的消失时间。题目难点在于需在传统最短路径算法(如D...

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

洛谷1220题解:动态规划与区间DP优化解法(附代码注释)

一、题目解读洛谷1220题要求计算在n个位置放置灯的情况下,通过关闭连续区间灯并移动至区间端点,使得总耗电量最小。需考虑灯的功率与位置差异,设计高效的算法求解最优策略。二、解题思路1. 动态规划 +...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。