给定一个s字符串和一个n字符串,在s字符串中找出n字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1使用c++语言写出ac代码
时间: 2024-02-10 14:10:46 浏览: 22
下面是使用 C++ 语言实现 strStr() 函数的代码:
```c++
#include <iostream>
#include <string>
using namespace std;
int strStr(string s, string n) {
int m = s.length(), k = n.length();
if (k == 0) return 0;
for (int i = 0; i <= m - k; i++) {
int j = 0;
while (j < k && s[i+j] == n[j]) {
j++;
}
if (j == k) return i;
}
return -1;
}
int main() {
string s = "hello world";
string n = "world";
int pos = strStr(s, n);
cout << pos << endl; // 输出 6
return 0;
}
```
在这个实现中,我们使用了两个指针 i 和 j 分别指向原字符串和子串。在循环中,我们依次比较 s[i+j] 和 n[j] 是否相等,如果相等就继续比较下一个字符。如果 j 等于子串的长度,说明找到了子串,返回子串在原字符串中的起始位置 i。如果循环结束后还没有找到子串,返回 -1。
相关问题
给定一个s字符串和一个n字符串,在s字符串中找出n字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1
好的,这个问题可以采用字符串匹配算法来解决,以下是一个基于暴力匹配的示例代码:
```
public static int findFirstAppearance(String s, String n) {
int slen = s.length();
int nlen = n.length();
if (slen < nlen) {
return -1;
}
for (int i = 0; i <= slen - nlen; i++) {
boolean flag = true;
for (int j = 0; j < nlen; j++) {
if (s.charAt(i + j) != n.charAt(j)) {
flag = false;
break;
}
}
if (flag) {
return i;
}
}
return -1;
}
```
这个方法的时间复杂度为 O(m*n),其中m为s字符串的长度,n为n字符串的长度。如果需要更高效的实现,可以采用KMP、BM、Sunday等算法来优化。
算法分析给定一个s字符串和一个n字符串,在s字符串中找出n字符串出现的第一个位置(从0开始)。如果不存在,则返回
这个问题可以使用经典的字符串匹配算法——KMP算法来解决。
KMP算法的核心思想是,当子串与主串不匹配时,不需要回溯主串的指针,而是利用已经匹配过的信息,将子串尽可能地往前移动一段距离,从而达到快速匹配的目的。
具体来说,KMP算法需要先对子串n进行预处理,得到一个next数组,其中next[i]表示当n的第i个字符与s不匹配时,n应该往后移动的位置。然后,我们用两个指针i和j分别遍历s和n,如果n[j]等于s[i],则i和j都往后移动一位;如果不匹配,我们利用next数组将j尽可能地往前移动,然后继续比较n[j]和s[i],直到找到匹配或者s遍历完毕。
具体实现可以参考以下代码:
```python
def kmp(s, n):
m, n = len(s), len(n)
if n == 0:
return 0
# 预处理next数组
next = [0] * n
j = 0
for i in range(1, n):
while j > 0 and n[i] != n[j]:
j = next[j-1]
if n[i] == n[j]:
j += 1
next[i] = j
# 匹配主串和子串
j = 0
for i in range(m):
while j > 0 and s[i] != n[j]:
j = next[j-1]
if s[i] == n[j]:
j += 1
if j == n:
return i - n + 1
return -1
```
其中,时间复杂度为O(m+n),其中m和n分别为s和n的长度。