344. 反转字符串 - 力扣(LeetCode)
整体思路:
双指针思想,前后两个指针,同时向中间靠拢(两两交换 对应的值,后再同时移动)。
void reverseString(vector& s) {
int left=0;
int right=s.size()-1;
while( left
题目链接:
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;
}
题目链接:
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. 反转字符串中的单词 - 力扣(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;
}
题目链接:
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());
}
友情链接 (代码随想录)
代码随想录