zoukankan      html  css  js  c++  java
  • 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 }

     

  • 相关阅读:
    Python运算符
    Python中的变量
    Chapter 4. Working with Key/Value Pairs
    Chapter 3. Programming with RDDs
    python常见的特异点
    18.天知道练习
    17.vue+axios搭配使用
    16.axios基本使用
    15.记事本练习
    14.v-model指令
  • 原文地址:https://www.cnblogs.com/Edviv/p/11762582.html
Copyright © 2011-2022 走看看