第四章 字符串part02
151.翻转字符串里的单词
题目:给你一个字符串 s ,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路:
- 将整个字符串都反转过来,那么单词的顺序就倒序了,但是单词本身也倒序了,那么再把单词反转一下,单词就正过来了。
- 移除多余空格
- 将整个字符串反转
- 将每个单词反转
class Solution:
def delete_space(self, s):
left, right = 0, len(s) - 1
# 去掉开头空白
while left <= right and s[left] == ' ':
left += 1
# 去掉末尾空白
while left <= right and s[right] == ' ':
right -= 1
# 去掉中间多余空白
output = []
while left <= right:
if s[left] != ' ':
output.append(s[left])
elif s[left] == ' ' and output[-1] != ' ':
output.append(s[left])
left += 1
return output
def reverse(self, s):
s = list(s)
left, right = 0, len(s) - 1
while left <= right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return s
def reverseWords(self, s: str) -> str:
s = list(s)
s = self.delete_space(s)
s = self.reverse(s)
# 反转每个单词
start = 0
for i, x in enumerate(s):
if x == ' ':
end = i
s[start:end] = self.reverse(s[start:end])
start = end + 1
elif i == len(s)-1:
s[start:] = self.reverse(s[start:])
return ''.join(s)
卡码网:55.右旋转字符串
题目:字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
// 版本一
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段
cout << s << endl;
}
459.重复的子字符串
KMP算法的一个应用,较难,二刷的时候再看
字符串总结
- 字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。
- 在C语言中,把一个字符串存入一个数组时,也把结束符 '\0’存入数组,并以此作为该字符串是否结束的标志。
- 在C++中,提供一个string类,string类会提供 size接口,可以用来判断string类字符串是否结束,就不用’\0’来判断是否结束。
- 双指针法在数组,链表和字符串中很常用。
- 其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
- 双指针法是字符串处理的常客。