有一个字符串数组words和字符数组chars

题目描述
有一个字符串数组 words 和一个字符串 chars。假如可以用 chars 中的字母拼写出 words 中的某个"单词"(字符串),那么我们就认为你掌握了这个单词。

words 的字符仅由 a-z 英文小写宁母组成,例如“abc”。

chars 由 a- z 英文小写字母和“?”组成,其中英文“?"表示万能字符,能够在拼写时当作任意一个英文字母。例如“?"可以当作"a"等字母。

注意: 每次拼写时,chars 中的每个字母和万能字符都只能使用一次。

输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。

输入描述
第一行: 输入数组 words 的个数,记作N。

第二行~第N+1行: 依次输入数组words的每个字符串元素。

第N+2行: 输入字符串 chars

输出描述
输出一个整数,表示词汇表 words 中你掌握的单词个数

备注

1 <= words.length <= 100

1 <= words[i].length, chars.length <= 100

所有字符串中都仅包含小写英文字母、英文问号

思路分析:使用桶标记来标记chars中的每个字符个数和问号个数,遍历words数组,对每个字符串来遍历桶标记,若某个字符个数为零则判断问号是否小于零,只有当两个都为零再去判断下一个字符串。

代码:
`#include

include <string.h>

using namespace std;
int b[53],c[53],flag=0;

int main()
{
int N,count=0;
char ch;
string str;
cin>>N;
string a[N];
for(int i=0;i<N;i++)
{
cin>>a[i];
}
cin.ignore();//清空输入上个输入信息
while(1)
{
ch=getchar();
if(ch=='\n')
break;
if(ch>='A'&&ch<='Z')
b[ch-'A']++;
else if(ch>='a'&&ch<='z')
b[ch-'a'+26]++;
else
b[52]++;
}
for(int i=0;i<N;i++)
{
for(int j=0;j<53;j++)
{
c[j]=b[j];
}
str=a[i];
flag=0;
for(int k=0;k<str.length();k++)
{
if(str[k]>'A'&&str[k]<'Z')
{
c[str[k]-'A']--;
if(c[str[k]-'A']<0)
{
if(c[52]>0)
c[52]--;
else
{
flag=1;
break;
}
}

		}
		if(str[k]>'a'&&str[k]<'z')
		{
			c[str[k]-'a'+26]--;
			if(c[str[k]-'a'+26]<0)
			{
				if(c[52]>0)
					c[52]--;
				else
				{
					flag=1;
					break;
				}
			}
			
		}
	}
	if(flag==0)
		count++;
} 
cout<<count;
return 0;

}`

个人问题:1、cin.ignore();
cin.ignore() 是 C++ 标准库中的一个输入流操作函数,用于忽略输入缓冲区中的字符。它在处理用户输入时非常有用,特别是在使用 cin 进行多种不同类型的输入时,可以帮助清除缓冲区中遗留的数据,以确保后续输入读取正确。
cin.ignore():无参数调用时,只会忽略下一个字符。
cin.ignore(int n):忽略接下来的 n 个字符。
cin.ignore(int n, char delim):忽略字符直到遇到分隔符 delim 或已经忽略了 n 个字符为止。
2、使用 getchar() 和 cin >> ch 处理输入字符时有一些细微的差异,这些差异会影响如何读取和判断换行符。
getchar()
功能:getchar() 函数从标准输入(通常是键盘)读取下一个字符,包括空白字符如空格、制表符和换行符。
换行符处理:当用户按下回车键时,getchar() 会返回换行符 '\n'。因此,可以直接用 ch == '\n' 判断是否遇到了换行符。
cin >> ch
功能:cin >> ch 从输入流中提取下一个非空白字符,并将其存储到变量 ch 中。它会跳过所有的空白字符(包括空格、制表符和换行符)。
换行符处理:由于 cin >> ch 跳过了空白字符,因此无法直接用于检测换行符。如果需要捕获换行符,需要使用其他方法,如 cin.get(ch) 或者 getline(cin, str) 来处理整个输入行。

问题分析:
时间复杂度:O(N*字符串平均长度)
空间复杂度:O(N)

posted @ 2024-07-23 16:10  jenniferCAI  阅读(53)  评论(0)    收藏  举报