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

文章目录

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

友情链接 (代码随想录)

代码随想录

相关推荐
运器12323 分钟前
【一起来学AI大模型】支持向量机(SVM):核心算法深度解析
大数据·人工智能·算法·机器学习·支持向量机·ai·ai编程
Zedthm31 分钟前
LeetCode1004. 最大连续1的个数 III
java·算法·leetcode
LIN-JUN-WEI43 分钟前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
神的孩子都在歌唱1 小时前
3423. 循环数组中相邻元素的最大差值 — day97
java·数据结构·算法
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法一)空间复杂度 O(M + N)
算法·leetcode·矩阵
眠りたいです1 小时前
Mysql常用内置函数,复合查询及内外连接
linux·数据库·c++·mysql
dying_man2 小时前
LeetCode--42.接雨水
算法·leetcode
笑鸿的学习笔记2 小时前
qt-C++语法笔记之Stretch与Spacer的关系分析
c++·笔记·qt
hardStudy_h2 小时前
C++——内联函数与Lambda表达式
开发语言·jvm·c++
vortex52 小时前
算法设计与分析 知识总结
算法