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

文章目录

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

一、344 反转字符串 :

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

整体思路: 

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

解决方案:

void reverseString(vector& s) {
        int left=0;
        int right=s.size()-1;
        while( left 

二、 514 反转字符串 ||

题目链接:

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

整体思路:

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

补充:

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

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

     template  < class BidirectionalIterator >
    void reverse (  BidirectionalIterator first  ,   BidirectionalIterator last  )  ;

解决方案:

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"之后的大小。然后双指针的思想,从后往前遍历,替换空格。

具体解决方案

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、再对局部进行翻转。

解题方案:

 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)

思路:

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

解题方案:

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

友情链接 (代码随想录)

代码随想录

你可能感兴趣的:(算法训练,算法,c++,c语言)