题目来源于知识星球—英雄算法联盟,七月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、2315.统计星号(简单)
1.题目描述
2.解题思路
题意为统计不在竖线对之间的“*”数,遍历字符串,当出现“|”时,计数器++,
当计数器为偶数时,表示已经出现一对竖线了,那么再往后遍历时,当出现
“*”时,ans+1。
3.代码演示(C++)
class Solution
{
public:
int countAsterisks(string s)
{
int cnt=0;
int ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='|')
{
cnt++;
}
else
{
if(cnt%2==0)
{
ans+=(s[i]=='*'?1:0);
}
}
}
return ans;
}
};
4.题目链接
二、459.重复的子字符串(简单)
1.题目描述
2.解题思路
构造一个函数判断给定的字符串是否有它的某一子字符串组成,然后将给定的字
符串截成一半遍历,如果是由它的某一子字符串组成的,返回true,否则返回
false。
3.代码演示(C++)
class Solution
{
bool isprestr(const string &str, const string &s)
{
int n = str.size();
for (int i = 0; i < s.size(); ++i)
{
if (s[i] != str[i%n])
{
return false;
}
}
return true;
}
public:
bool repeatedSubstringPattern(string s)
{
string str = "";
for (int i = 0; i < s.size()/2; ++ i)
{
str += s[i];
if (s.size()%str.size() == 0)
{
if (isprestr(str, s))
{
return true;
}
}
}
return false;
}
};
4.题目链接
三、1790.仅执行一次字符串交换能否使两个字符串相等(简单)
1.题目描述
2.解题思路
看的题解。
3.代码演示(C++)
class Solution
{
void swap(char &a, char &b)
{
char tmp = a;
a = b;
b = tmp;
}
public:
bool areAlmostEqual(string s1, string s2)
{
if (s1.size() != s2.size())
{
return false;
}
vector<int> dif;
for (int i = 0; i < s1.size(); ++i)
{
if (s1[i] != s2[i])
{
dif.push_back(i);
}
}
if (!dif.size())
{
return true;
}
if (dif.size() == 2)
{
swap(s1[dif[0]], s1[dif[1]]);
return s1 == s2;
}
return false;
}
};
4.题目链接
四、1961.检查字符串是否为数组前缀(简单)
1.题目描述
2.解题思路
将word中的元素相连,每次相连之后判断与s是否相等。
3.代码演示(C++)
class Solution
{
public:
bool isPrefixString(string s, vector<string>& words)
{
string substr = "";
for (int i = 0; i < words.size(); ++ i)
{
substr += words[i];
if (substr.size() == s.size())
{
return s == substr;
}
else if (substr.size() > s.size())
{
return false;
}
}
return false;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!