合格的字符串
题目内容:老师给布置了一些作业,让学生按照一个模版写一些字符串交上来。现在请你帮老师写一个程序,帮助老师确定各个字符串是否合格。
首先老师有一个匹配模版,比如是“aa[123]bb”这一个字符串,如aa1bb、aa2bb、aa3bb都算是正确匹配,而aacbb就是错误的字符串。(即待查字符串对应于模版方括号内的部分,应该为方括号内字符串的一个子字符)。
我们需要做的就是按照模版,找出正确的字符串和所在的行。
输入格式:
输入的第一行为一个整数n,表示有多少个学生的作业,即有多少行需要检查的字符串。(1<=n<=50)中间为n行字符串,代表着n个学生们写的作业。每个字符串长度小于50。最后一行为1行字符串,代表着老师给的匹配模板。
输出格式:
输出合格的字符串的行号和该字符串。(中间以空格隔开)
输入样例:
4
Aab
a2B
ab
ABB
a[a2b]b
输出样例:
1 Aab
2 a2B
4 ABB
大小写字母是匹配的
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int lenleft = 0;
int lenright = 0;
string change;
string lefts;
string rights;
bool judge(string hom)
{
int l = hom.size();
string t;
for (int i = 0; i < l; i++)
{
if (hom[i] >= 'A'&&hom[i] <= 'Z')
t+= hom[i] + 32;
else
t+= hom[i];
}
if (l - lenleft - lenright != 1)
return 0;
string tl = t.substr(0, lenleft);
string tr = t.substr(lenleft + 1);
if (tl != lefts || tr != rights)
return 0;
char c = t[lenleft];
if (change.find(c) == string::npos)
return 0;
return 1;
}
int main()
{
string hom[51];
string tem;
string t;
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
cin >> hom[i];
}
cin >> tem;
int l = tem.size();
int le = tem.find('[');
lenleft = le; //1
int ri = tem.find(']');
lenright = l - ri - 1; //7-5-1=1
change = tem.substr(le + 1, l - lenleft - lenright - 2);
lefts = tem.substr(0, lenleft);
rights = tem.substr(ri + 1);
for (int i = 0; i < lenleft; i++)
{
if (lefts[i] >= 'A'&&lefts[i] <= 'Z')
lefts[i] += 32;
}
for (int i = 0; i < l - ri - 1; i++)
{
if (rights[i] >= 'A'&&rights[i] <= 'Z')
rights[i] += 32;
}
for (int i = 0; i < l - lenleft - lenright - 2; i++)
{
if (change[i] >= 'A'&&change[i] <= 'Z')
change[i] += 32;
}
for (int i = 1; i <= n; i++)
{
if (judge(hom[i]))
cout << i << " " << hom[i] << endl;
}
return 0;
}