算法训练营第九天 | 字符串:总结篇

文章目录

    • 力扣 | 344 反转字符串
    • 力扣 | 514 反转字符串 ||
    • 剑指offer 05. 替换空格
    • 力扣 | 151 . 翻转字符串中的单词
    • 剑指offer 58-|| .左旋转字符串

一、344 反转字符串 :

344. 反转字符串 - 力扣(LeetCode)

整体思路:

双指针思想,前后两个指针,同时向中间靠拢(两两交换 对应的值,后再同时移动)。

解决方案:

cpp 复制代码
void reverseString(vector<char>& s) {
        int left=0;
        int right=s.size()-1;
        while( left <right ){
            swap(s[left],s[right]);
            left++;
            right--;
        }
    }

二、 514 反转字符串 ||

题目链接:

541. 反转字符串 II - 力扣(LeetCode)

整体思路:

借助库函数 reverse 实现, 遍历字符串,每次 移动2k 。

补充:

reverse() 函数 是C++中用于反转容器中的元素顺序。左闭右开。

函数原型: first 和 last 表示要反转的序列的起始和结束迭代器。

template < class BidirectionalIterator >

void reverse ( BidirectionalIterator first , BidirectionalIterator last ) ;

解决方案:

cpp 复制代码
string reverseStr(string s, int k) {
    
        int size = s.length();    //字符串的长度
        //每一段的是2k
        for(int i = 0; i < size ; i += 2*k){
            
            //剩余的字符小于 2k 但是大于或等于k
            if( i+k <=size ){  
                reverse(s.begin()+i,s.begin()+i+k);
            }else{   //剩余得字符少于  k个
                reverse(s.begin()+i,s.end());
            }
        }
        return s;
    }

三、 剑指offer 05. 替换空格

题目链接:

LCR 122. 路径加密 - 力扣(LeetCode)

由于力扣下架了剑指offer, 所以跳转之后不是我们想要的题目。

题目描述:

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。(我们这里要求不能使用额外的空间)。

示例 1: 输入:s = "We are happy."

输出:"We%20are%20happy."

思路:

遍历字符串 ,将原来的字符串扩大每个空格替换成"%20"之后的大小。然后双指针的思想,从后往前遍历,替换空格。

具体解决方案

cpp 复制代码
string replaceSpace(string s){
    int legth = s.length();   //原始的长度
    int size = s.length();
    for (int i = 0; i < s.length(); i++) {
	   if (s[i] == ' ') {
		  size += 2;
	    }
    }
    s.resize(size);    //重新设置s的大小
   //从后面往前遍历
    int kuai = legth-1, man = size-1;
    for ( ; kuai >= 0; kuai--) {
	   if (s[kuai] == ' ') {
		 s[man--] = '0';
		 s[man--] = '2';
		 s[man--] = '%';
	   }else {
		 s[man] = s[kuai];
		 man--;
	   }
    }
    return s;
}

四、151 . 翻转字符串中的单词

题目链接

151. 反转字符串中的单词 - 力扣(LeetCode)

解题思路:

1、去掉字符串多余的空格( 双指针的思想 )。

2、将字符串整体翻转。

3、再对局部进行翻转。

解题方案:

cpp 复制代码
 string reverseWords(string s) {
      int kuai = 0, man = 0 ;
      for ( ; kuai < s.length(); kuai++ ) {
	        if (s[kuai] != ' ') {  //遇到单词了
		        //手动添加空格
		    if (man != 0)  s[man++] = ' ';
		        //收集单词
		    while ( kuai < s.length() && s[kuai] != ' ') { //如果遇到空格则停止收集
			    s[man++] = s[kuai++];
		    }
	        }
      }
        s.resize(man);
        //第一次整体翻转
        reverse(s.begin(), s.end());
        //第二次局部翻转
        int temp = 0;    //辅助 i 来记录一个区间
        int i = 0;
        while ( i < s.length() ) {
	        if ( s[i]!= ' ') {
		        i++;
		        continue;
	        }
	        reverse( s.begin() + temp , s.beg
            in() + i );
	        temp = i + 1 ;
	        i++;
        }
         //处理最后一个单词
        reverse(s.begin() + temp, s.end());
        return s;
    }

五、剑指offer 58-|| .左旋转字符串

题目链接:

LCR 182. 动态口令 - 力扣(LeetCode)

思路:

先整体翻转,再局部进行翻转。

解题方案:

cpp 复制代码
string dynamicPassword(string password, int target) {
       //先整体翻转
      reverse( password .begin() , password.end());
       //然后局部翻转
       int size = password.length();
       reverse(password.begin() ,password.begin()+ (size-target));

       reverse(password.begin()+ (size-target), password.end());
    
    }

友情链接 (代码随想录)

代码随想录

相关推荐
David猪大卫3 小时前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
汉克老师4 小时前
CSP-J 2026 第二轮入门组真题解析(第一题 、旅游)
c++·csp-j·信息学竞赛·小学生学c++
xiaoye-duck5 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
老师我太想进步了20268 小时前
【数据结构-4】算法美学之顺序表
数据结构·算法
风影同志783248 小时前
编码器是激活函数吗?—— 一个看起来很像、其实不是的类比
算法
UIU1149 小时前
P1481 魔族密码
c++·算法·动态规划
Zwawa11 小时前
两根线怎么挂住一堆设备:I2C 协议原理
c语言·单片机·嵌入式
加宝的起点雷达12 小时前
40 条候选里 38 条来自同一个源,主卡整屏重样
人工智能·算法·创业
秋天的怀念_David12 小时前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法