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\n",ans,idx);
35     else printf("-1\n");
36     return 0;
37 }

 

猜你喜欢

转载自www.cnblogs.com/Edviv/p/11762582.html