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;
    }
    
  • 相关阅读:
    build tools
    文档系统总结
    各进制及其转换详解
    JQuery 函数执行顺序
    计算页面宽高的函数
    Linq中的多表左联,详细语句
    css设置滚动条颜色与样式以及如何去掉与隐藏滚动条
    基于JQUERY写的 LISTBOX 选择器
    js/jquery 实时监听输入框值变化的完美方案:oninput & onpropertychange
    JQuery select控件的相关操作
  • 原文地址:https://www.cnblogs.com/quanjun/p/12697775.html
Copyright © 2011-2022 走看看