文章目录
-
- 力扣 | 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());}
友情链接 (代码随想录)
代码随想录