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

文章目录

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

友情链接 (代码随想录)

代码随想录

相关推荐
汉字萌萌哒几秒前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法
2301_807180542 分钟前
icpc江西:L. campus(dij最短路)
算法
th新港2 分钟前
CCF201909_1
数据结构·c++·算法·ccf
意如流水任东西2 分钟前
[C++]类和对象(上)
开发语言·c++
DdddJMs__1353 分钟前
C语言 | Leetcode C语言题解之题409题最长回文串
c语言·leetcode·题解
Dola_Pan4 分钟前
字符串的KMP算法详解及C/C++代码实现
算法
孤寂大仙v8 分钟前
【C++】STL----stack和queue常见用法
开发语言·c++
didiplus13 分钟前
【趣学Python算法100例】百钱百鸡
python·算法·百钱百鸡
Monodye21 分钟前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
pzx_00126 分钟前
【内积】内积计算公式及物理意义
数据结构·python·opencv·算法·线性回归