此代码不适用于 { "parses" , "parsecs" }

this code is not working for {"parses", "parsecs"}

本文关键字:parses parsecs 代码 不适用 适用于      更新时间:2023-10-16
#include<iostream>
#include<vector>
#include<string>
using namespace std;
bool letterCheck(vector<string> arr)
{
int b=0;
int l1=arr[0].length();
int l2=arr[1].length();
for(int i=0;i<l1;i++)
{
for(int j=0;j<l2;j++)
{
if(tolower(arr[1][i])==tolower(arr[0][j]))
b++;
}
}
if(b<arr[1].length())
return false;
else return true;
}

int main()
{
vector <string> v={"parses", "parsecs"};
cout<<letterCheck(v);
return 0;
}

它是一个程序,它接受两个字符串的数组,并检查第二个字符串中的字母是否存在于第一个字符串中。

示例:字母检查(["恍惚", "花蜜"]( ➞ true

letterCheck(["compadres", "DRAPES"]( ➞ true

letterCheck(["parses", "parsecs"]( ➞ false

该程序适用于上述给定的对。它为 {"parses", "parsecs"} 返回 true,但它应该返回 false。任何人都可以告诉我,代码中的问题是什么,我可以做些什么来消除这个问题?

直接的问题是,您尝试计算匹配的字符,以查看第二个字符串中的所有字符是否在第一个字符串中都匹配。但是,由于第一个字符串中有重复的字符,因此计算出错:两个’s’的存在使b比您希望的要大。一旦找到一个角色,您就可以打破循环以避免问题。

顺便说一句,将未经检查的char传递给tolower()可能会使您获得未定义的行为:在大多数平台上,char是有符号的,但tolower()有一个先决条件,要求参数为nin-negative 或EOF

此外,b < arr[1].length()的结果是一个bool(尽管它需要反转(:没有必要写一个花哨的条件来把它变成一个布尔值。