1.最常见的单词
给定一个段落和一个禁用单词列表。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,且答案唯一。禁用单词列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。
2.山羊拉丁文
给定一个由空格分割的句子S。每个单词只包含大写或小写字母。我们要将句子转换为拉丁文。
3.亲密字符串
给定两个由小写字母够成的字符串A和B,只要我们可以通过交换A中的两个字母得到与B相等的结果,就返回true;否则返回false。
4.特殊等价字符串组
你将得到一个字符串数组A。
如果经过任意次数的移动,S = T,那么两个字符串S和T是特殊等价的。一次移动包括选择两个索引i和j,且i%2 = j%2,并且交换S[i]和S[j]。
现在规定,A中的特殊等价字符串组是A的非空子集S,这样不在S中的任何字符串与S中的任何字符串都不是特殊等价的。
返回A中特殊等价字符串组的数量。
思路:将奇数位和偶数位相等的字符串划分到一个等价类中
//判断是否满足等价关系
bool isEqual(string S, string T)
{
int a[26] = {0}; //存放奇数位
int b[26] = {0}; //存放偶数位
//S的奇数位
for(int i = 0; i < S.size(); i += 2)
{
a[S[i] - 'a']++;
}
//S的偶数位
for(int i = 1; i < S.size(); i += 2)
{
b[S[i] - 'a']++;
}
//验证T
for(int i = 0; i < T.size(); i += 2)
{
a[T[i] - 'a']--;
}
for(int i = 1; i < T.size(); i += 2)
{
b[T[i] - 'a']--;
}
for(int i = 0; i < 26; i++)
{
if(a[i] != 0 || b[i] != 0)
{
return false;
}
}
return true;
}
int numSpecialEquivGroups(vector<string>& A) {
//特殊等价:S和T的所有奇数位的字符相同,偶数位的字符相同
//求A的等价类数量,等价关系是特殊等价
//划分办法:从i = 0开始,把A[i]的等价元素全部删除
//最后剩余的元素个数就是等价类的数目
//约定:用空串“”代表已删除
for(int i = 0; i < A.size(); i++)
{
while(i < A.size() && A[i] == " ")
{
i++;
}
for(int j = i + 1; j < A.size(); j++)
{
if(A[j] != " ")
{
if(isEqual(A[i], A[j]))
{
A[j] = " ";
}
}
}
}
int res = 0;
for(int i = 0; i < A.size(); i++)
{
if(A[i] != " ")
{
res++;
}
}
return res;
}