c++比较字符串是不是子串
时间: 2024-01-02 12:05:10 浏览: 89
可以使用C++中的string类的find函数来判断一个字符串是否为另一个字符串的子串。具体实现如下:
```c++
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "hello world";
string str2 = "world";
if (str1.find(str2) != string::npos) {
cout << str2 << " is a substring of " << str1 << endl;
} else {
cout << str2 << " is not a substring of " << str1 << endl;
}
return 0;
}
```
输出结果为:
```
world is a substring of hello world
```
相关问题
C++中字符串去掉子串
在C++中,如果你想从字符串中移除特定的子串,有几种方法可以实现。这里我们介绍两种:
方法1:使用`find`和`erase`[^1]:
```cpp
#include <iostream>
#include <string>
int main() {
std::string str = "This is a string with ijn in it.";
std::string substr_to_remove = "ijn";
size_t pos = 0;
while ((pos = str.find(substr_to_remove, pos)) != std::string::npos) {
str.erase(pos, substr_to_remove.length());
// 更新查找起始位置以避免重复删除
pos += substr_to_remove.length();
}
std::cout << "New string without 'ijn': " << str << std::endl;
return 0;
}
```
这种方法逐次查找并删除子串,但如引用中提到的,如果子串在字符串中多次出现,这可能会导致意外的结果。
方法2:更安全地使用`std::replace`[^2],这个函数会替换而不会影响其他相同子串的位置:
```cpp
#include <iostream>
#include <string>
int main() {
std::string str = "This is a string with ijn in it.";
std::string substr_to_remove = "ijn";
std::string::size_type pos = 0;
while ((pos = str.find(substr_to_remove, pos)) != std::string::npos) {
str.replace(pos, substr_to_remove.length(), "");
pos += substr_to_remove.length(); // 跳过已替换的部分
}
std::cout << "New string without 'ijn': " << str << std::endl;
return 0;
}
```
这段代码会找到并替换子串,确保只删除一次每个子串。
用C++求字符串的子串个数(不重叠)
可以使用双重循环枚举所有的子串,再用一个标记数组记录已经出现过的子串,最后统计未出现过的子串的个数即可。
以下是示例代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1005;
int main() {
char s[MAXN];
cin >> s;
int n = strlen(s);
bool vis[MAXN][MAXN] = {false};
for (int len = 1; len <= n; len++) { // 枚举子串长度
for (int i = 0; i + len - 1 < n; i++) { // 枚举子串起始位置
int j = i + len - 1; // 子串结束位置
for (int k = i; k <= j; k++) { // 枚举子串中的每个字符
if (vis[i][j]) break; // 如果该子串已经出现过,跳过
vis[i][j] |= vis[i][k] & vis[k + 1][j]; // 判断是否重叠
}
if (!vis[i][j]) vis[i][j] = true; // 如果该子串未出现过,标记为已出现
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (vis[i][j]) ans++;
}
}
cout << ans << endl;
return 0;
}
```
注意,上述代码的时间复杂度为 $O(n^3)$,可能会超时,需要根据具体情况进行优化。
阅读全文