原题链接:竞赛 - 力扣 (LeetCode)
目录
A. 有效单词
根据题意模拟即可。
首先字符串长度小于3,直接return false;
f1判断是否有元音字母,f2判断是否有辅音字母(值为1表示有,值为0表示没有)。开一个set来存字符种类数,小于3直接return false。
最后如果f1和f2均为1,return true;否则 return false。
class Solution {
public:
bool isValid(string word) {
if(word.size()<3) return false;
int f1=0,f2=0;
set<char> s;
for(auto i:word){
if(i=='@'||i=='#'||i=='$') return false;
s.insert(i);
if(i=='a'||i=='e'||i=='i'||i=='o'||i=='u'||
i=='A'||i=='E'||i=='I'||i=='O'||i=='U') f1=1;
else if((i>='a'&&i<='z')||(i>='A'&&i<='Z')) f2=1;
}
if(s.size()<3) return false;
if(f1&&f2) return true;
else return false;
}
};
B. K周期字符串需要的最少操作次数
因为字符串长度word.size()和子串的长度k已知。我们令分割(使用s.substr()实现字符串分割)出的子串个数为x=word.size()/k。
从头遍历字符串,将字符串分割为x个长度为k的子串,依次存入到map中。
开一个变量mx表示个数最多的子串的个数,并初始化为0。遍历map,找到个数最多的子串。
return x-mx 即可。
class Solution {
public:
int minimumOperationsToMakeKPeriodic(string word, int k) {
int x=word.size()/k;
map<string,int> mp;
for(int i=0;i<word.size();i+=k){
mp[word.substr(i,k)]++;
}
int mx=0;
for(auto i:mp) mx=max(mx,i.second);
return x-mx;
}
};
C. 同位字符串连接的最小长度 (补题)
将字符串s分为长度为p的子串,并检查每个子串字母出现次数是否相同。
class Solution {
public:
int minAnagramLength(string s) {
int n=s.size();
int cnt[26]={0};
for(auto i:s) cnt[i-'a']++; //计算整个字符串每种字母出现次数
auto check = [&](int len){ //检查子串长度是否可能为len
for(int i=0;i<n;i+=len){
int tmp[26]={0}; //统计当前子串每种字母出现次数
for(int j=0;j<len;j++) tmp[s[i+j]-'a']++;
for(int j=0;j<26;j++){
if(tmp[j]*(n/len)!=cnt[j]) return false;
}
}
return true;
};
for(int i=1;i<=n;i++){ //枚举子串的长度
if(n%i==0&&check(i)) return i;
}
return -1;
}
};