• P 1308 统计单词数 双指针解法


    题意:在一篇文章中查找某个单词出现的次数,大小写等价(即 a == A,依次类推对应等价)

    输入:第一行一个单词

    第二行:一篇文章,包含输入的空格。

    暴力做法两重 for 循环查找 时间复杂度 O(n2)

    题解:先将两个串的单词转换成大写 或者 小写

               下一步开始进行匹配查找

               第一次匹配查找成功时记录第一次匹配的初始位置

    时间复杂度分析:O(n)

    双指针算法:

            算法思想: 利用问题本身与序列的特性(序列递增性质),使用两个下标i、j对序列进行扫描 (可以同向扫描,也可以反向扫描) ,以较低的复杂度解决问题。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 1e6 + 7;
     4 char word[20], sec[maxn];
     5 int ans, idx, flag = 1;
     6 void Reserve(char p[], int len)  //小写转换成大写
     7 {
     8     for(int i = 0; i < len; i++)
     9         if(p[i] <= 'z' && p[i] >= 'a') p[i] -= 32;
    10 }
    11 
    12 int main()
    13 {
    14     gets(word), gets(sec);  //输入单词,输入句子
    15     int len1 = strlen(word), len2 = strlen(sec);
    16     Reserve(word,len1), Reserve(sec,len2);  //全部变为大写
    17 
    18     for(int i = 0, j = 0; i < len2;)  //双指针做法
    19     {
    20         if(sec[i+j] == word[j] && (i > 0  && sec[i-1] == ' ')) j++;  // 字符匹配情况
    21         else                                  //主串对应字母与单词要匹配, 句子的字母匹配开始时前面会有一个空格
    22         {
    23             if(j == len1 && (i+j == len2 || sec[i+j] == ' ')) //单词匹配成功,句子中单词匹配末尾有空格或者匹配到句子末尾
    24             {
    25                 ans++;  //单词出现次数加 1
    26                 if(flag) idx = i, flag = 0;  //记录单词第一次匹配成功的位置
    27 
    28             }
    29             i++;  // i 指针后移
    30             j = 0;  //j回溯至 0
    31         }
    32     }
    33 
    34     if(ans) printf("%d %d
    ",ans,idx);
    35     else printf("-1
    ");
    36     return 0;
    37 }

     

  • 相关阅读:
    config Doku wiki
    [转载]【python】ipython与python的区别
    数组和指针
    C++初始化数据成员
    RSA算法原理
    C++四种cast
    百度笔试准备2
    百度笔试准备1
    百度面试准备
    C++的空类中默认产生哪些类成员函数
  • 原文地址:https://www.cnblogs.com/Edviv/p/11762582.html
Copyright © 2020-2023  润新知