4 条题解

  • 7
    @ 2022-10-2 19:37:30

    题解

    这道题有一个很简单的做法,我最开始写了一个特别复杂的。 我们先输入,顺便sis_i 都变成小写:

    #include <bits/stdc++.h>
    using namespace std;
    string f, s;
    int main()
    {
        cin >> f; // 这里string使用cin读入
        cin.ignore(); // 忽略换行符,getchar();也可以
        getline(cin, s); // 整行读入s
        // 如果不忽略换行符,则getline会直接读到上面的cin >> f剩下的回车,直接结束。
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z') // 判断
                s[i] = s[i] - 'A' + 'a'; // 修改
        }
        return 0;
    }
    

    我们可以把主字符串(就是第二个字符串)按空格分解。

    #include <bits/stdc++.h>
    using namespace std;
    string f, s, nxt;
    vector<string> sp;
    int main()
    {
        // cin, getline输入
        cin >> f;
        cin.ignore();
        getline(cin, s);
        nxt = ""; // 最开始目前这一字符串为空
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
            if (s[i] == ' ') // 空格
            {
                sp.push_back(nxt); // 把nxt压进去
                nxt = ""; // 清空
            }
            else
            {
                nxt += s[i]; // 直接加到nxt里
            }
        }
        sp.push_back(nxt); // 最后没有空格把nxt压进去,我们手动压进去
        return 0;
    }
    

    接下来我们可以枚举所有 spisp_i,当 spi=fsp_i = f 时说明找到一个单词,让 cnt++cnt++

    #include <bits/stdc++.h>
    using namespace std;
    int cnt = 0;
    string f, s, nxt;
    vector<string> sp;
    int main()
    {
        // cin, getline输入
        cin >> f;
        cin.ignore();
        getline(cin, s);
        nxt = "";
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
            if (s[i] == ' ')
            {
                sp.push_back(nxt);
                nxt = "";
            }
            else
            {
                nxt += s[i];
            }
        }
        sp.push_back(nxt);
        for (int i = 0; i < sp.size(); i++)
        {
            if (sp[i] == f) // 成立
            {
                cnt++; // 统计
            }
        }
        if (cnt == 0) printf("-1\n"); // 没有
        return 0;
    }
    

    cnt=0cnt = 0 时说明没有,输出 -1。 可是题目还让我们计算第一次出现的字符位置,我们可以通过记录一个 vector pp,来保存所有空格的下一位,在第一次出现时可以让 first=pifirst = p_i

    #include <bits/stdc++.h>
    using namespace std;
    int cnt = 0, first = -1;
    string f, s, nxt;
    vector<int> p;
    vector<string> sp;
    int main()
    {
        // cin, getline输入
        cin >> f;
        cin.ignore();
        getline(cin, s);
        p.push_back(0); // 最开始第一个单词也有可能,所以要把第一个开头0也加进去
        nxt = "";
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
            if (s[i] == ' ')
            {
                p.push_back(i + 1); // 记录空格的下一个
                sp.push_back(nxt);
                nxt = "";
            }
            else
            {
                nxt += s[i];
            }
        }
        sp.push_back(nxt);
        for (int i = 0; i < sp.size(); i++)
        {
            if (sp[i] == f)
            {
                cnt++;
                if (first == -1) first = p[i]; // 当first = -1时,说明为第一个
            }
        }
        if (cnt == 0 && first == -1) printf("-1\n");
        else printf("%d %d\n", cnt, first);
        return 0;
    }
    

    ACAC CodeCode

    #include <bits/stdc++.h>
    using namespace std;
    int cnt = 0, first = -1;
    string f, s, nxt;
    vector<int> p;
    vector<string> sp;
    int main()
    {
        cin >> f;
        cin.ignore();
        getline(cin, s);
        p.push_back(0);
        nxt = "";
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
            if (s[i] == ' ')
            {
                p.push_back(i + 1);
                sp.push_back(nxt);
                nxt = "";
            }
            else
            {
                nxt += s[i];
            }
        }
        sp.push_back(nxt);
        for (int i = 0; i < sp.size(); i++)
        {
            if (sp[i] == f)
            {
                cnt++;
                if (first == -1) first = p[i];
            }
        }
        if (cnt == 0 && first == -1) printf("-1\n");
        else printf("%d %d\n", cnt, first);
        return 0;
    }
    
    • @ 2022-12-17 18:52:30

      你这个代码有个小bug,试试这个样例:To to be or not to be is a question

      原因:忘考虑f的大小写问题了。

      一下是本人修改后的代码:

      #include <bits/stdc++.h>
      using namespace std;
      int cnt = 0, first = -1;
      string f, s, nxt = "";
      vector<int> p;
      vector<string> sp;
      int main()
      {
          cin >> f;
          cin.ignore();
          getline(cin, s);
          p.push_back(0);
          for (int i = 0 ; i < f.length() ; i++)//统一f大小写
          {
              if (f[i] >= 'A' && f[i] <= 'Z') f[i] = f[i] - 'A' + 'a';
          }
          for (int i = 0; i < s.length(); i++)
          {
              if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a';
              if (s[i] == ' ')
              {
                  p.push_back(i + 1);
                  sp.push_back(nxt);
                  nxt = "";
              }
              else
              {
                  nxt += s[i];
              }
          }
          sp.push_back(nxt);
          for (int i = 0; i < sp.size(); i++)
          {
              if (sp[i] == f)
              {
                  cnt++;
                  if (first == -1) first = p[i];
              }
          }
          if (cnt == 0 && first == -1) cout << -1;
          else cout << cnt << " " << first;
          return 0;
      }
      
      
  • 2
    @ 2023-7-3 11:46:48
    #include <iostream>
    #include <vector>
    using namespace std;
    vector<string> vec;
    string s, ss, txt = "";
    int ans, pos;
    int main()
    {
        cin >> s;
        for (int i = 0; i < (int)s.length(); i++)
            if (s[i] <= 'Z' && s[i] >= 'A')
                s[i] += 32; 
        cin.ignore();
        getline(cin, ss);
        for (int i = 0; i < (int)ss.length(); i++)
        {
            if (ss[i] <= 'Z' && ss[i] >= 'A')
                ss[i] += 32; 
            if (ss[i] == ' ')
            {
                vec.push_back(txt);
                txt = "";
            }
            else
                txt += ss[i];
        }
        vec.push_back(txt);
        bool flag = true;
        for (int i = (int)vec.size() - 1; i >= 0; i--)
        {
            if (vec[i] == s)
            {
                ans++;
                pos = i;
                flag = false;
            }
        }
        int t_pos = 0;
        for (int i = 0; i < pos; i++)
        {
            t_pos++;
            t_pos += (int)vec[i].length();
        }
        if (flag)
            cout << -1;
        else
            cout << ans << ' ' << t_pos;
    }
    
    • 1
      @ 2023-10-20 13:00:20

      主要知识 https://blog.csdn.net/ONE_KICK/article/details/126196478 在360极速浏览器打开

      #include <bits/stdc++.h>
      using namespace std;
      string a,b;
      int main(){
      	getline(cin,a);
      	getline(cin,b);//输入一整行 
      	for (int i=0;i<a.length();i++){
              a[i]=tolower(a[i]);
          }
          for (int i=0;i<b.length();i++){
              b[i]=tolower(b[i]);
          }//转成小写 
          a=' '+a+' ';
          b=' '+b+' ';//比较容易配对 
          if (b.find(a)==string::npos){
          	cout<<-1;
      	}//判断 
      	else{
      		int al=b.find(a);//单词最先出现的位置 
      		int bl=b.find(a);
      		int s=0;//答案 
      		while(bl!=string::npos){
      			s++;
      			bl=b.find(a,bl+1);//下一个判断 
      		}
      		cout<<s<<" "<<al<<endl;//输出答案 
      	}
      	return 0;
      }
      
      • 0
        @ 2022-8-29 14:26:08

        这个题我也是暴力的做法,首先把两个字符串都转成了小写,其次第二个字符串带空格,我们可以用getline读入它。

        然后我分离了第二个字符串存到了一个vector里,并且把空格也单独存了一次。

        for (int i = 0; i < b.length(); ++i)
            {
                b[i] = tolower(b[i]);//转小写
                if ((b[i] == ' ') || i == b.length() - 1)
                {
                    v.push_back(s);//不仅存s,也存一次空格
                    v.push_back(" ");
                    s = "";//清空s
                }
                if (b[i] != ' ')//记录当前单词情况
                    s += b[i];
            }
        

        然后开始寻找出现次数,遍历vector就得到了

        寻找第一个位置,也是遍历一次

        #include <bits/stdc++.h>
        using namespace std;
        string s;
        vector<stirng> v;
        int main()
        {
            string a, b;
            getline(cin, a);
            getline(cin, b);
            for (int i = 0; i < a.length(); ++i)
            {
                a[i] = tolower(a[i]);
            }
            for (int i = 0; i < b.length(); ++i)
            {
                b[i] = tolower(b[i]);
                if ((b[i] == ' ') || i == b.length() - 1)
                {
                    v.push_back(s);
                    v.push_back(" ");
                    s = "";
                }
                if (b[i] != ' ')
                    s += b[i];
            }
            int ans = 0;
            for (int i = 0; i < v.size(); i++)
            {
                if (v[i] == a)
                    ans++;
            }
            int ans2 = 0;
            for (int i = 0; i < v.size(); i++)
            {
                if (v[i] != a)
                {
                    ans2 += v[i].length();
                }
                if (v[i] == a)
                {
                    break;
                }
            }
            if (ans != 0)
                cout << ans << " " << ans2;
            else
                cout << -1;
            return 0
        }
        
        • 1

        [普及][NOIP2011 普及组] 统计单词数

        信息

        ID
        1550
        时间
        1000ms
        内存
        256MiB
        难度
        6
        标签
        递交数
        222
        已通过
        74
        上传者