原题链接:竞赛 - 力扣 (LeetCode)
目录
A. 有效单词
B. K周期字符串需要的最少操作次数
C. 同位字符串连接的最小长度 (补题)
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){ //检查子串长度是否可能为lenfor(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;}};