:给定一个主字符串 str 和子字符串 substr,求 出 substr 在 sub 中的位置,返回第一个匹配项的下标( 下标从 0 开始),如果 substr 字符串不是 str 的一部分 ,则返回 -1 。补全函数 matchStr ,以实现特定功能。 输入的参数 : str 主字符串,长度为 mlen;substr 子字 符串,长度为 slen。字符串长度范围是 1 <= slen <= mlen <= 1e4
时间: 2024-03-03 21:48:37 浏览: 84
可以使用暴力匹配算法,逐个比较主字符串和子字符串的每个字符。具体实现如下:
```python
def matchStr(str, substr):
mlen = len(str)
slen = len(substr)
if slen > mlen:
return -1
for i in range(mlen - slen + 1):
j = 0
while j < slen:
if str[i+j] != substr[j]:
break
j += 1
if j == slen:
return i
return -1
```
使用示例:
```python
str = "hello world"
substr = "world"
print(matchStr(str, substr)) # 输出 6
substr = "python"
print(matchStr(str, substr)) # 输出 -1
```
相关问题
计算一个字符串(子串)在另一个字符串(长串)中出现的次数。#include <string.h> #include <iostream> using namespace std; int frequency(char * substr, char * str); int main() { char sub[128],str[1024]; cin.getline(sub,128); // 输入子串 cin.getline(str,1024); // 输入长串 int n = frequency(sub,str); // 调用frequency函数,计算子串在长串中出现的次数 cout<<n<<endl; // 输出次数 return 0; } // 函数frequency:计算子串在长串中出现的次数 // 参数:substr-指向子串,str-指向长串 // 返回值:出现的次数 int frequency(char * substr, char * str) { // 请在此添加代码,实现函数frequency /********** Begin *********/ /********** End **********/ }
可以使用字符串匹配算法来计算一个字符串(子串)在另一个字符串(长串)中出现的次数。以下是一个简单的实现,使用了朴素的字符串匹配算法:
```c++
int frequency(char * substr, char * str) {
int n = strlen(substr);
int m = strlen(str);
int count = 0;
for (int i = 0; i <= m - n; i++) {
bool match = true;
for (int j = 0; j < n; j++) {
if (substr[j] != str[i+j]) {
match = false;
break;
}
}
if (match) {
count++;
}
}
return count;
}
```
这个函数首先计算出子串和长串的长度,然后依次在长串中搜索子串。对于长串中的每个位置,如果该位置开始的子串与给定的子串匹配,则计数器加1。最后返回计数器的值,即子串在长串中出现的次数。
需要注意的是,这个实现并不是最优的。在实际应用中,可以使用更高效的字符串匹配算法,例如KMP算法、Boyer-Moore算法、Rabin-Karp算法等。
设不存在一个子串连续出现的字符串称为免平方字符串,给定一个字符串,问它是不是免平方字符串【C/C++】
要判断一个字符串是否为免平方字符串,我们需要遍历字符串的所有子串,检查是否存在连续出现的子串。下面是一个示例的C++代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
bool isSquareFree(string str) {
int len = str.length();
for (int i = 0; i < len - 1; i++) {
for (int j = i + 2; j <= len; j++) {
string sub = str.substr(i, j - i);
int subLen = sub.length();
for (int k = 0; k < len - subLen + 1; k++) {
if (k != i && str.substr(k, subLen) == sub) {
return false;
}
}
}
}
return true;
}
int main() {
string str;
cout << "请输入字符串: ";
cin >> str;
if (isSquareFree(str)) {
cout << "该字符串是免平方字符串" << endl;
} else {
cout << "该字符串不是免平方字符串" << endl;
}
return 0;
}
```
在上面的示例代码中,我们首先定义了一个函数 `isSquareFree` 用来判断给定的字符串是否为免平方字符串。该函数通过两层循环遍历所有子串,然后再通过内层循环检查是否存在连续出现的子串。
在 `main` 函数中,我们先输入一个字符串,然后调用 `isSquareFree` 函数进行判断,并输出结果。
注意:这只是一个简单的示例实现,可能不是最优的解法。实际应用中,可能需要根据实际情况进行优化。
阅读全文