zoukankan      html  css  js  c++  java
  • 洛谷P1308 统计单词数 题解 模拟

    题目链接:https://www.luogu.com.cn/problem/P1308

    解题思路:
    这道题目因为需要记录第一个单词出现的位置,所以需要整行读入。
    我们假设给定单词是 s,给定文章是 t。那么在C++当中,使用char数组可以按照如下方式输入:

    char s[maxn], t[maxn];
    gets(s);
    gets(t);
    

    使用string可以按照如下方式输入:

    string s, t;
    getline(cin, s);
    getline(cin, t);
    

    因为这里不区分大小写,所以我们在一开始可以考虑将所有字母都转成小写(C++中可以使用 tolower() 函数)。

    然后,我们假设假设 (s) 的长度为 (n)(t) 的长度为 (m)

    则我们枚举文章 t 的每一个位置,则只要满足如下两个条件:

    • (t[i]) 开始的长度为 (n) 的子串和 (s) 相同;
    • 这个子串是一个单独的子串,即:
      1. i==0 或者 t[i-1] == ' ';同时
      2. i+n==m 或者 t[i+m] == ' '

    则我们知道了一个满足条件的子串。

    比较字符串,可以在内层再开一个for循环,也可以使用 strncmp(char数组) 或者 t.substr(i,n)==s(string) 来判断。

    示例代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    string s, t;
    int n, m, num, id = -1;
    int main() {
        getline(cin, s);
        getline(cin, t);
        n = s.length();
        m = t.length();
        for (int i = 0; i < n; i ++) s[i] = tolower(s[i]);
        for (int i = 0; i < m; i ++) t[i] = tolower(t[i]);
        for (int i = 0; i+n-1 < m; i ++) {
            if (t.substr(i, n) == s && (i==0 || t[i-1]==' ') && (i+n==m || t[i+n]==' ')) {
                num ++;
                if (id == -1) id = i;
            }
        }
        if (id != -1) cout << num << " " << id << endl;
        else puts("-1");
        return 0;
    }
    
  • 相关阅读:
    泛型与非泛型
    C# 调用CMD,执行DOS命令
    数据库设计随笔(ZZ)
    关于三层开发(zz)
    三层架构学习(转)
    Node.js & child_process All In One
    HTML5 Canvas Tag Cloud All In One
    macOS & VSCode terminal show current git branch All In One
    飞书 excel 固定列 All In One
    git diff one of committed file All In One
  • 原文地址:https://www.cnblogs.com/quanjun/p/12697775.html
Copyright © 2011-2022 走看看