题意:在一篇文章中查找某个单词出现的次数,大小写等价(即 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 }