字符串水题记

在这里插入图片描述

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KissKernel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值