字符串回文单词统计代码异常:输入"I Deed"未正确返回2个回文单词
问题分析与修复:回文单词统计代码错误
任务描述
给定由单词组成的字符串s,统计其中回文单词的数量。回文单词指正读和反读完全相同的单词,单词间由一个或多个空格分隔。
问题现象
- 输入
"Deed"时,代码返回1(结果正确) - 输入
"I Deed"时,代码仅返回1,正确结果应为2
代码bug定位
问题出在回文判断的索引使用上:
int i=st; int j=e-1; bool isPalindrome=true; while(i<=j) { if(temp[i]!=temp[j]) { isPalindrome=false; break; } i++; j--; }
这里错误地使用了原字符串的索引st和e-1来访问临时字符串temp。temp是当前单词的小写副本,它的索引范围是0到temp.size()-1,而非原字符串的位置索引。当处理第二个及以后的单词时,st已经是原字符串中靠后的位置,用它访问temp会导致索引越界,进而错误地判定单词不是回文。
比如输入"I Deed"时,处理第二个单词"Deed"生成的temp是"deed",但代码用st=2作为起始索引访问temp,temp[2]是有效字符,但j=e-1=5超出了temp的长度(仅4个字符),越界访问的随机值会导致回文判断失败,最终计数少加1。
修复后的代码
#include <bits/stdc++.h> char toLowerCase(char ch) { if(ch>='A' && ch<='Z') { ch=ch-'A'+'a'; } return ch; } int countNumberOfPalindromeWords(string s) { int st=0,e=0; int lengt=s.length(); int cnt=0; while(st<lengt && e<lengt) { if(s[e]!=' ') { string temp=""; while(e<lengt && s[e]!=' ') { temp+=toLowerCase(s[e]); e++; } // 改用temp的本地索引判断回文 int i=0; int j=temp.size()-1; bool isPalindrome=true; while(i<=j) { if(temp[i]!=temp[j]) { isPalindrome=false; break; } i++; j--; } if(isPalindrome) { cnt++; } st=e; } else{ e++; st++; } } return cnt; }
修复说明
将回文判断的起始索引改为0,末尾索引改为temp.size()-1,确保在temp的有效范围内进行字符比较,正确识别每个单词是否为回文。
内容的提问来源于stack exchange,提问作者DEEPAK
相关产品推荐
相关产品推荐

