代码随想录算法训练营第九天 | 151.翻转字符串里的单词, 卡码网:55.右旋转字符串 & 了解KMP算法
151. Reverse Words in a String
这题对于我C++能力的提升有很多帮助啊,强调了C++对比起Python强大的地方,能inplace修改string所以空间复杂度为O(1)。这个算法也很妙
题目链接:151. Reverse Words in a String
题目链接/文章讲解/视频讲解: 代码随想录讲解
我的代码:
这里就不po我的Python代码了,用的split库函数哈哈哈 偷工减料
C++:
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 fast=0; fast < s.size(); fast++) {
if (s[fast] != ' ') {
if (slow != 0) {
s[slow] = ' ';
slow++;
}
while (fast < s.size() && s[fast] != ' ') {
s[slow] = s[fast];
slow++;
fast++;
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
// Time Complexity: O(n)
// Space Complexity: O(1)
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;
}
};
卡码网:55.右旋转字符串
这题Python的解法我能写出来,C++的解法reverse两次我还是在视频的引导下写出的。深刻体会到C++能把Space Complexity降到O(1)的绝妙,突然有点嫌弃Python哈哈哈哈哈,但是Python真的好简洁可爱。
题目链接/文章讲解:右旋转字符串
我的代码:
Python:
k = int(input())
string = input()
res = ""
shift = k % (len(string))
first_half = string[:len(string)-shift]
second_half = string[len(string)-shift:]
res += second_half
res += first_half
print(res)
C++:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
reverse(s.begin(), s.end());
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
cout << s << endl;
}
28. Find the Index of the First Occurrence in a String (跳过)
跳过的implementation,仔细看了视频讲解的KMP算法,有点感觉了,争取下一次拿下。
题目链接:Leetcode28
题目链接/文章讲解/视频讲解:代码随想录讲解KMP
459. Repeated Substring Pattern(跳过)
虽然之前报名过一期刷题,但上次只坚持到第二天,所以这一次也算是第一遍刷,半跳过这题。直接看了讲解,没有自己implement,感觉懂了70%-80%,有空的时候再多看两遍做一做。
题目链接:repeated substring pattern
题目链接/文章讲解/视频讲解:代码随想录讲解
总结
赶进度中lol前两天偷懒休息了两天需要尽快补上
每次都很喜欢读卡尔学长的总结篇,希望之后自己也能写写每个章节的总结篇
代码随想录:字符串章节总结
代码随想录:双指针总结