AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

AcWing 446. 统计单词数    原题链接    简单

作者: 作者的头像   ywt51 ,  2023-05-26 22:37:45 ,  所有人可见 ,  阅读 31


0


算法1:双重循环(暴力枚举) $O(n^2)$
#include <bits/stdc++.h>
using namespace std;

string a, b;

int main() {
    getline(cin, a);
    getline(cin, b);

    a = " " + a + " ";
    b = " " + b + " ";

    //统一格式
    for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
    for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);

    int p = -1, cnt = 0;
    for (int i = 0; i < b.size(); ++ i) {
        if (b[i] == a[0]) { //开头相等-进入遍历
            int j = 0;
            while (b[i+j] == a[j]) j++;
            if (j == a.size()) {
                if (p == -1) p = i;
                cnt ++;
            }
            // bool f = 1; //for循环遍历,标记
            // for (int j = 0; j < a.size(); ++ j) 
            //     if (b[i+j] != a[j]) {
            //         f = 0;
            //         break;
            //     }
            // if (f) {
            //     if (p == -1) p = i;
            //     cnt ++;
            // }
        }
    }
    if (cnt) cout << cnt << " " << p;
    else cout << -1;
    return 0;
}
算法2:调用库函数-双重循环() $O(n^2)$
#include <bits/stdc++.h>
using namespace std;

string a, b;

int main() {
    getline(cin, a);
    getline(cin, b);
    a = " " + a + " ";
    b = " " + b + " ";

    //统一格式
    for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
    for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);

    //利用find函数查找 找不到,返回的是2的64次方-1,内存中64位全部是1,就是-1
    int p = b.find(a), cnt = 0, st;

    if (p != -1) {
        st = p; //记录第一次出现的位置
        cnt++;
        while ((p = b.find(a, p+1)) != -1) cnt++;
        cout << cnt << ' ' << st;
    } else {
        cout << -1;
    }
    return 0;
}
算法3:把连续不含空格的单词拼接起来,判断是否相等() $O(n^2)$
#include <bits/stdc++.h>
using namespace std;

string a, b;

int main() {
    getline(cin, a);
    getline(cin, b);

    //统一格式
    for (int i = 0; i < a.size(); ++ i) a[i] = toupper(a[i]); //tolower()
    for (int i = 0; i < b.size(); ++ i) b[i] = toupper(b[i]);

    b = b + ' ';//确保最后能走到else中 判断是否相等 

    string t = "";
    int p  = -1, cnt = 0;
    for (int i = 0; i < b.size(); ++ i) {
        if (b[i] != ' ') t += b[i]; //连续字符就拼接起来
        else { //是空格
            if (t == a) {
                cnt++;
                if (cnt == 1) p = i - a.size();
            }
            t = "";
        }
    }
    if (p != -1) cout << cnt << ' ' << p;
    else cout << p;
    return 0;
}

0 评论

你确定删除吗?

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息