寻找字符串中的字符对 [重复] 。

问题描述 投票:0回答:1
#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。

我也试着使用子串函数,但没有成功。

c++ string data-structures stl substring
1个回答
0
投票

我不明白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;
}

0
投票

你是在一个字符串向量中寻找 "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页)。字符串搜索算法),并在每发现一次出现后在正确的状态下恢复。

© www.soinside.com 2019 - 2024. All rights reserved.