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

文章目录

    • 力扣 | 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());
    
    }

友情链接 (代码随想录)

代码随想录

相关推荐
生成论实验室18 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星31 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
iCxhust2 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
晨曦夜月2 小时前
map与unordered_map区别
算法·哈希算法
Morwit2 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·