#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int count = 0;
vector<string> v;
string resp;
cin >> resp;
v.push_back(resp);
for(int i = 0; i < v.size(); i++){
if(find(v.begin(), v.end(), "xy") != v.end()){
count++;
}
cout << count << endl;
}
return 0;
}
我想在多个测试用例中找到字符串中的字符 "xy"。对于输入xy,我的计数值正确输出为1。
但是对于输入的xyxxy,它给出的值是0,而不是2。
我也试着使用子串函数,但没有成功。
我不明白while循环的概念,但这对我来说很有效。
#include <iostream>
#include <vector>
int main()
{
std::string str;
std::cin >> str;
int count = 0;
for (int i(0); i < str.size()-1; ++i)
{
if ((str[i] == 'x') && (str[i + 1] == 'y'))
{
++count;
}
}
std::cout << count;
}
你是在一个字符串向量中寻找 "xy",在你的例子中,它只有一个元素 "xyxxy"。由于 "xy "不等于 "xyxxy",你找不到任何匹配的元素。
但是即使你尝试 std::find
"xyxxy "本身的 "xy"--这也会失败,因为 std::find
找寻 单元 的范围内(或者说,迭代器对)。
相反,你可以使用 string::find()
方法,所述 此处或,视情况而定。std::string_view::find()
:
#include <string>
#include <vector>
#include <iostream>
#include <string_view>
int main() {
const std::string needle{"xy"};
std::string haystack;
std::cin >> haystack;
std::size_t count{0};
std::string_view remainder{haystack};
while(true) {
auto first_pos = remainder.find(needle);
if (first_pos == std::string_view::npos) { break; }
count++;
remainder = remainder.substr(first_pos+needle.length());
}
std::cout << "Found " << count << " occurrences of \"" << needle << "\"\n";
}
注:这没有考虑到重叠的情况。如果你想要这些,你可以一直只增加1个起始位置;或者通过采用Boyer-Moore或Knuth-Morris-Pratt搜索的方法使你的解决方案更复杂(见第2页)。字符串搜索算法),并在每发现一次出现后在正确的状态下恢复。