mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-11 13:00:22 +08:00
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。
|
很明显暴力解法的时间复杂度是$O(n^2)$,这道题目暴力解法在leetcode上是可以过的。
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
|
@ -259,7 +259,7 @@ void getNext(int* next, const string& s)
|
|||||||
|
|
||||||
然后还要对next数组进行初始化赋值,如下:
|
然后还要对next数组进行初始化赋值,如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
int j = -1;
|
int j = -1;
|
||||||
next[0] = j;
|
next[0] = j;
|
||||||
```
|
```
|
||||||
@ -278,8 +278,8 @@ next[i] 表示 i(包括i)之前最长相等的前后缀长度(其实就是
|
|||||||
|
|
||||||
所以遍历模式串s的循环下标i 要从 1开始,代码如下:
|
所以遍历模式串s的循环下标i 要从 1开始,代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
for(int i = 1; i < s.size(); i++) {
|
for (int i = 1; i < s.size(); i++) {
|
||||||
```
|
```
|
||||||
|
|
||||||
如果 s[i] 与 s[j+1]不相同,也就是遇到 前后缀末尾不相同的情况,就要向前回退。
|
如果 s[i] 与 s[j+1]不相同,也就是遇到 前后缀末尾不相同的情况,就要向前回退。
|
||||||
@ -292,7 +292,7 @@ next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度
|
|||||||
|
|
||||||
所以,处理前后缀不相同的情况代码如下:
|
所以,处理前后缀不相同的情况代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了
|
while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了
|
||||||
j = next[j]; // 向前回退
|
j = next[j]; // 向前回退
|
||||||
}
|
}
|
||||||
@ -300,7 +300,7 @@ while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了
|
|||||||
|
|
||||||
3. 处理前后缀相同的情况
|
3. 处理前后缀相同的情况
|
||||||
|
|
||||||
如果s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。
|
如果 s[i] 与 s[j + 1] 相同,那么就同时向后移动i 和j 说明找到了相同的前后缀,同时还要将j(前缀的长度)赋给next[i], 因为next[i]要记录相同前后缀的长度。
|
||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ void getNext(int* next, const string& s){
|
|||||||
|
|
||||||
i就从0开始,遍历文本串,代码如下:
|
i就从0开始,遍历文本串,代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
for (int i = 0; i < s.size(); i++)
|
for (int i = 0; i < s.size(); i++)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -356,7 +356,7 @@ for (int i = 0; i < s.size(); i++)
|
|||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
while(j >= 0 && s[i] != t[j + 1]) {
|
while(j >= 0 && s[i] != t[j + 1]) {
|
||||||
j = next[j];
|
j = next[j];
|
||||||
}
|
}
|
||||||
@ -364,7 +364,7 @@ while(j >= 0 && s[i] != t[j + 1]) {
|
|||||||
|
|
||||||
如果 s[i] 与 t[j + 1] 相同,那么i 和 j 同时向后移动, 代码如下:
|
如果 s[i] 与 t[j + 1] 相同,那么i 和 j 同时向后移动, 代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (s[i] == t[j + 1]) {
|
if (s[i] == t[j + 1]) {
|
||||||
j++; // i的增加在for循环里
|
j++; // i的增加在for循环里
|
||||||
}
|
}
|
||||||
@ -376,7 +376,7 @@ if (s[i] == t[j + 1]) {
|
|||||||
|
|
||||||
代码如下:
|
代码如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
if (j == (t.size() - 1) ) {
|
if (j == (t.size() - 1) ) {
|
||||||
return (i - t.size() + 1);
|
return (i - t.size() + 1);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
模拟的队列执行语句如下:
|
模拟的队列执行语句如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
queue.push(1);
|
queue.push(1);
|
||||||
queue.push(2);
|
queue.push(2);
|
||||||
queue.pop(); // 注意弹出的操作
|
queue.pop(); // 注意弹出的操作
|
||||||
|
@ -21,7 +21,7 @@ empty() -- 返回队列是否为空。
|
|||||||
|
|
||||||
示例:
|
示例:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
MyQueue queue = new MyQueue();
|
MyQueue queue = new MyQueue();
|
||||||
queue.push(1);
|
queue.push(1);
|
||||||
queue.push(2);
|
queue.push(2);
|
||||||
|
@ -67,7 +67,7 @@ deque是一个双向队列,只要封住一段,只开通另一端就可以实
|
|||||||
|
|
||||||
我们也可以指定vector为栈的底层实现,初始化语句如下:
|
我们也可以指定vector为栈的底层实现,初始化语句如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
|
std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ std::stack<int, std::vector<int> > third; // 使用vector为底层容器的栈
|
|||||||
|
|
||||||
也可以指定list 为起底层实现,初始化queue的语句如下:
|
也可以指定list 为起底层实现,初始化queue的语句如下:
|
||||||
|
|
||||||
```
|
```cpp
|
||||||
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
|
std::queue<int, std::list<int>> third; // 定义以list为底层容器的队列
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user