字符串
344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
1 | class Solution { |
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
1 | class Solution { |
请实现一个函数,把字符串 s 中的每个空格替换成”%20”。
1 | class Solution { |
151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
1 | class Solution { |
定义了三个函数: 字符串翻转函数, 去空格的函数, 和最后的单词翻转符号.
其中去空格可以使用双指针法。字符串反转函数先将整个字符串翻转, 然后去掉空格, 最后通过判断空格的位置进行单词的翻转实现最后的结果. 注意单词翻转函数调用了其他的两个函数,需要对这两个函数传递参数,所以字符串用引用的方式&s, 如果不用引用不正确。因为如果不引用传递的是形参,不会引起实际参数的变化。
reverse函数是
剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。
1 | class Solution { |
注意reverse的作用范围。
28. 实现 strStr() - 力扣(LeetCode) (leetcode-cn.com)
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
1 | class Solution { |
注意返回为0的判断要考虑全面, 需要加上haystack.size() < needle.size()一句
这种方法时间复杂度是O(m*n)
如果用KMP算法, 可以大大降低时间复杂度.
例子:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。
前缀表指的是模式串的最长相同前后缀, 比如上面的例子就是(0, 1, 0, 1, 2, 0)
这个前缀表写代码的时候也叫做next数组, next数组的求解方式如下:
1 | void getNext(int* next, const string& s) { |
其中j的物理含义是前缀末尾, i的物理含义是后缀末尾。
28题的KMP解法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33class Solution {
public:
void getNext(string &s, int *next)
{
int j = 0;
next[0] = 0;
for(int i = 1; i < s.size(); i++)
{
while(j > 0 && s[i] != s[j])
j = next[j - 1];
if(s[i] == s[j])
j++;
next[i] = j;
}
}
int strStr(string haystack, string needle) {
if(needle.size() == 0)
return 0;
int next[needle.size()];
getNext(needle, next);
int j = 0;
for(int i = 0; i < haystack.size(); i++)
{
while(j > 0 && haystack[i] != needle[j])
j = next[j - 1];
if(haystack[i] == needle[j])
j++;
if(j == needle.size())
return(i - needle.size() + 1);
}
return -1;
}
};
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
1 | class Solution { |
也是KMP的思想, 先求next数组,然后如果数组末尾非0且 字符串长度 % (字符串长度 - next数组最后一个元素) == 0则说明字符串可以由子字符串构成。
如果getNext想不出来了, 就考虑字符串aabaaa.s