当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 168868提问 提问时间:2023-11-02 23:23:29阅读次数: 68

最佳答案 问答题库688位专家为你答疑解惑

文章目录

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

一、344 反转字符串 :

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

整体思路: 

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

解决方案:

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

解决方案:

string reverseStr(string s, int k) {int size = s.length();    //字符串的长度//每一段的是2kfor(int i = 0; i < size ; i += 2*k){//剩余的字符小于 2k 但是大于或等于kif( 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.begin() + 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());}

友情链接 (代码随想录)

代码随想录

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"算法训练营第九天 | 字符串:总结篇":http://eshow365.cn/6-30593-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!