原代码
#include<string>
using namespace std;
int main() {
string s;
int count = 0;
int flag[1000] = {0};
int sum= 0 ;
int num = 0;
string page;
getline(cin,s);
getline(cin,page);
for(int i = 0;i<page.length()-1;i++)
{
//算空格
if(page[i]==' ')
{
sum++;
}else{
num++;
}
//算不是空格
if((page[i]=='t' ||page[i]=='T') && (page[i+1]=='o' ||page[i+1]=='O'))
{
flag[count]=num-i-sum-1;
count++;
}
}
//测试
//cout << sum<<endl<<num <<endl;
//打印
if(count>0){
cout << count <<' ' << flag[0];
}else{
cout << -1;
}
}
/*if(s =="To")
{
cout << 2 << ' ' << 0;
}
else if(s == "to")
{
cout << -1;
}
*/
跟ai描述我的问题的提示词: 请分析我的代码实现是否正确处理了以下关键点:1) 不区分大小写的单词匹配 2) 完全独立单词的识别(排除部分匹配情况)3) 第一次出现位置的正确计算 4) 空格分隔单词的解析。在我的代码基础上,指出具体错误位置和逻辑缺陷,给出修正后的完整代码实现,并标注出关键修改点和原错误原因。要求修正后的代码能正确处理所有边界情况,包括:单词在开头/结尾、连续多个空格、大小写混合等情况。
链接:https://ac.nowcoder.com/acm/contest/125942/D 来源:牛客网
**题目描述 **
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章 中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 ) 输入描述:
共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章 输出描述:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 -1。
ai回答
代码关键点分析
不区分大小写的单词匹配:您的代码没有处理这一点。它直接使用 page[i]=='t'这样的条件进行判断,这意味着'T'不会被识别。
完全独立单词的识别:您的代码无法正确识别。它只检查了连续的字符't'和'o',这会错误地匹配像"tomato"这样的单词中的"to"部分,违反了“完全匹配”的原则。
第一次出现位置的正确计算:计算逻辑 flag[count]=num-i-sum-1非常复杂且很可能不正确。它试图通过字符总数、空格数和索引来反推位置,这种方法不可靠,也未能准确记录单词首字母的位置。
空格分隔单词的解析:虽然统计了空格和非空格字符,但这些信息没有被有效地用于划分单词边界。循环逻辑混淆了字符计数和单词识别。
错误原因与修正思路
您的代码主要问题在于试图通过统计字符来“拼凑”出单词位置,而不是先明确定义什么是单词,再进行处理。一个单词是由字母组成、被非字母字符(在本题中特指空格)分隔的独立单元。
一个被广泛采用且可靠的解决思路是 “添加空格定界法”
其核心步骤是:
-
统一转换为小写:消除大小写影响 。
-
添加边界空格:在目标单词和文章的首尾都添加一个空格。这样,文章中的独立单词会变成" word "的形式,可以确保使用 find方法时只匹配到完整的单词 。
3.循环查找:使用字符串的 find函数在处理后的文章中查找处理后的单词,并统计次数和记录首次位置。
完整代码:
#include <string>
using namespace std;
int main() {
string s;
string page;
getline(cin, s);
getline(cin, page);
int count = 0;
int firstPos = -1; // 记录第一次出现的位置
bool inWord = false; // 标记是否处于单词中
int wordStart = 0; // 记录当前单词的起始位置
string currentWord; // 记录当前正在识别的单词
// 关键修改点1:手动转换为小写,实现不区分大小写
for (char &c : s) {
if (c >= 'A' && c <= 'Z') {
c = c + 32; // 大写转小写
}
}
for (char &c : page) {
if (c >= 'A' && c <= 'Z') {
c = c + 32;
}
}
// 关键修改点2:在原文前后添加空格,便于独立单词匹配
page = " " + page + " ";
// 关键修改点3:遍历文章寻找匹配的独立单词
for (int i = 0; i < page.length(); i++) {
// 如果当前字符不是空格,则在单词中
if (page[i] != ' ') {
if (!inWord) {
inWord = true;
wordStart = i; // 记录单词开始位置(在添加了首空格后,索引需调整)
}
} else { // 遇到空格,一个单词结束
if (inWord) {
// 关键修改点4:提取当前单词并与目标比较
string wordInText = page.substr(wordStart, i - wordStart);
if (wordInText == s) {
count++;
if (firstPos == -1) {
// 计算在原文章中的位置(减去添加的首空格)
firstPos = wordStart - 1;
}
}
inWord = false;
}
}
}
// 输出结果
if (count > 0) {
cout << count << " " << firstPos;
} else {
cout << -1;
}
return 0;
}

京公网安备 11010502036488号