文章目录
- [2315. 统计星号](https://leetcode.cn/problems/count-asterisks/)
- [459. 重复的子字符串](https://leetcode.cn/problems/repeated-substring-pattern/)
- [1790. 仅执行一次字符串交换能否使两个字符串相等](https://leetcode.cn/problems/check-if-one-string-swap-can-make-strings-equal/)
- [1961. 检查字符串是否为数组前缀](https://leetcode.cn/problems/check-if-string-is-a-prefix-of-array/)
2315. 统计星号
思路:遍历一边数组,用flag标记,有效区间是交替出现的以’|‘为分割符,每次遇到’|'就跳出循环,在循环内部,如果flag为真,说明该区间是有效区间就将星号计数加到ans上。跳出循环后++i指向下一个区间同时逆置标记位flag。
class Solution {
public:
int countAsterisks(string s) {
int flag = 1;
int ans = 0;
int i =0;
while(i<s.size())
{
while(s[i]!='|' && i<s.size())
{
if(s[i]=='*' && flag) ans++;
i++;
}
i++;
flag = !flag;
}
return ans;
}
};
459. 重复的子字符串
思路:将字符串分为不同长度的多段字符串,然后判断每次划分是不是满足每小段都相等
class Solution {
public:
bool is_ans(const string& s,int n)
{
int len = s.size();
int cnt = len/n;//段数
for(int i = 0;i<cnt;i++)
{
for(int j = 0;j<n;j++)
{
if(s[i*n+j]!=s[j])
return false;
}
}
return true;
}
bool repeatedSubstringPattern(string s) {
int len = s.size();
for(int i=1;i<len;i++)
{
if(len%i==0)
{
if(is_ans(s,i))
return true;
}
}
return false;
}
};
1790. 仅执行一次字符串交换能否使两个字符串相等
思路:就是先判断如果是长度不同直接返回false,然后去字符串里面查找对应字符不相同的位置,保存到u1如果两个字符串完全相同u1==size返回true,否则在去查找第二个对于字符不同的位置,然后交换这两个对应字符的位置,判断是否相等。
class Solution {
public:
bool areAlmostEqual(string s1, string s2) {
if(s1.size()!=s2.size())
return false;
int u1 = 0,u2 = 0;
while(u1<s1.size())
{
if(s1[u1]!=s2[u1])
{
break;
}
u1++;
}
if(u1==s1.size()) return true;
u2 = u1+1;
while(u2<s1.size())
{
if(s1[u2]!=s2[u2])
break;
u2++;
}
swap(s2[u1],s2[u2]);
return s1==s2;
}
};
1961. 检查字符串是否为数组前缀
将words中的字符串连接到一个新的string对象上,每连接一个字符串就和s比较一次,相等返回true
class Solution {
public:
bool isPrefixString(string s, vector<string>& words) {
string _cmp;
for(int i = 0;i<words.size();i++)
{
_cmp+=words[i];
if(_cmp==s) return true;
}
return false;
}
};