P246
T1:
思路:利用set关联容器。将str2中的字符放入关联容器中,然后以此为参照物扫描str1的逐个字符,判断是否在str2中出现过,可用set中的find()函数。但是我的问题不在于这,而是在于处理带空格的字符串输入输出上。
输入输出参考文章 https://www.cnblogs.com/qiang-wei/p/9332201.html
利用getline(cin,string s)接受带空格的字符串。在输入字符串之前会输入一个标识字符串组数的n,接着输入回车标识输入n结束,下一步缓冲区中仍然存在着这个空行符,所以在输入字符串之前得清除缓冲区的换行符。用
cin.clear();
cin.ignore();清除缓冲区的一个字符,接着再用getline(cin,string s)输入字符串就正常了。
void deleteCharacter(string str1, string str2)
{
if (str1.empty())
return;
if (str2.empty())
{
//cout << "str2 is empty" << endl;
cout << str1 << endl;
return;
}
set<char> strSet;
int i = 0;
while (str2[i]!='\0')
{
strSet.insert(str2[i]);
++i;
}
int j = 0;
while (str1[j]!='\0')
{
if (strSet.find(str1[j]) == strSet.end())
{
cout << str1[j];
}
++j;
}
cout << endl;
}
int main()
{
int n;
cin >> n;
cin.clear();
cin.ignore();
while (n--)
{
string str1,str2;
getline(cin, str1);
getline(cin, str2);
deleteCharacter(str1, str2);
}
return 0;
}T2:
思路:同样运用set关联容器。由于set中insert特性,可以将字符串的字符insert进set容器中,若有重复的字符,则插入失败。
string deleteDuplicate(string str)
{
string resultStr;
if (str.empty())
return resultStr;
set<char> strSet;
int i = 0;
while (str[i]!='\0')
{
auto ret = strSet.insert(str[i]);
if (ret.second)
{
resultStr.push_back(str[i]);
}
++i;
}
resultStr.push_back('\0');
return resultStr;
}
int main()
{
int n;
cin >> n;
cin.clear();
cin.ignore();
while (n--)
{
string str1;
getline(cin, str1);
string resultStr = deleteDuplicate(str1);
cout << resultStr << endl;
}
return 0;
}T3:
思路:用的书上的思想。注意hash数组的简历和初始化。
bool test(string str1, string str2)
{
if (str1.length() != str2.length()||str1.empty()||str2.empty())
return false;
const int tableSize = 256;
int hashTable[tableSize];
for (unsigned int k = 0; k < tableSize; ++k)
{
hashTable[k] = 0;
}
int i = 0;
while (str1[i]!='\0')
{
hashTable[str1[i++]] ++;
}
int j = 0;
while (str2[j] != '\0')
{
hashTable[str2[j++]] --;
}
for (unsigned int k = 0; k < tableSize; ++k)
{
if (hashTable[k] != 0)
{
return false;
}
}
return true;
}
int main()
{
int n;
cin >> n;
cin.clear();
cin.ignore();
while (n--)
{
string str1, str2;
getline(cin, str1);
getline(cin, str2);
cout << test(str1, str2) << endl;
}
return 0;
}
京公网安备 11010502036488号