代码随想录算法训练营第八天| 344.反转字符串 541.反转字符串II 剑指offer05.替换空格 151.反转字符串中的单词 剑指offer58-II.左旋转字符串

目录

LeeCode 344.反转字符串

LeeCode 541.反转字符串II

LeeCode 剑指offer05.替换空格   

LeeCode 151.反转字符串中的单词

LeeCode 剑指offer58-II.左旋转字符串  

总结


LeeCode 344.反转字符串

力扣题目链接

思路:

双指针分别从字符串首尾遍历数组,每次进行交换,直至左指针遍历到数组中间。

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i = 0,j = s.size() - 1; i < (s.size())/2; i++,j--){
            swap(s[i],s[j]);
        }
    }
};

LeeCode 541.反转字符串II

力扣题目链接

思路:

在遍历字符串的过程中,让 i += (2 * k),i 每次移动 2 * k 就可以了,判断是否需要有反转的区间。

class Solution {
public:
    string reverseStr(string s, int k) {
    	for (int i = 0; i < s.size(); i += (2 * k)) {
    		if(i + k <= s.size()){
    			reverse(s.begin() + i, s.begin() + i + k);
			}
			else {
				reverse(s.begin() + i, s.end()); 
			}
		}
    return s;
    }
};

LeeCode 剑指offer05.替换空格   

力扣题目链接

思路:

扩充原数组到每个空格替换成“%20”后的大小,利用双指针法从后向前替换空格。

class Solution {
public:
    string replaceSpace(string s) {
    	int count = 0;//统计空格个数 
		int soldsize = s.size();
		for (int i = 0; i < s.size(); i++){
			if (s[i] == ' ') {
				count++;
			}
		} 
		s.resize(s.size() + count * 2);
		int snewsize = s.size();
		for (int i = snewsize - 1, j = soldsize - 1; j < i; i--,j--){
			if (s[j] != ' '){
				s[i] = s[j];
			}
			else {
				s[i] = '0';
				s[i - 1] = '2';
				s[i - 2] = '%';
				i -= 2;
			}
		}
        return s;
    }
};

时间复杂度:O(n)   空间复杂度:O(1)


LeeCode 151.反转字符串中的单词

力扣题目链接

思路: 

先删去多余空格,翻转整个字符串,翻转每个单词。

class Solution {
public:
    void reverse(string& s, int start, int end) {
    	for (int i = start, j = end; i < j; i++,j--) {
    		swap(s[i], s[j]);
		}
	}
	//去除所有空格并在相邻单词间添加空格,快慢指针 
	void removeextraspaces(string& s) {
		int slow = 0;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] != ' '){
				if (slow != 0) s[slow++] = ' ';
				while (i < s.size() && s[i] != ' ') {
					s[slow++] = s[i++];
				}
			}
		}
		s.resize(slow);
	}
	string reverseWords(string s) {
		removeextraspaces(s);
		reverse(s, 0, s.size() - 1);
		int start = 0;
		for (int i = 0; i <= s.size(); i++) {
			if (i == s.size() || s[i] == ' ') {
				reverse(s, start, i - 1);
				start = i + 1;
			}
		} 
		return s;
	}
};

LeeCode 剑指offer58-II.左旋转字符串  

力扣题目链接

思路:

反转区间为前n的子串;反转区间为n到末尾的子串;反转整个字符串

class Solution {
public:
    string reverseLeftWords(string s, int n) {
    	reverse(s.begin(), s.begin() + n);
		reverse(s.begin() + n,s.end());
		reverse(s.begin(), s.end());
		return s; 
    }
};

 总结:

1.尽管解题的关键步骤可以调用库函数,但为了加深理解打基础,还是自己写比较好。其余非关键部分可以使用库函数。

2.替换空格中从后向前而非从前向后是因为,若从前向后,替换过的元素后边的元素都需要再次移动,时间复杂度为O(n²)。

3.反转字符串中的单词:移除空格操作:移除字符串前的空格、移除单词之间的空格、移除字符串后的空格,比较复杂,可以通过移除所有空格,然后在单词之间再添加空格实现。  (思路参考:27.移除元素)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值