力扣集训刷题第二天

2315统计星号

解题思路

首先,我们要知道,只有第二个竖线之后或者(重点:第一个竖线之前)遇到的'*'才可以被计算在内。
所以我们要对|进行计数变量名为num,为了防止进行比较的量变化(即,如果只有几个竖线,我们一般先和0比然后再和2,4,...2n去比),找到规律后,我们对num进行对2取余,所以每次就只需要和0去比就可以了。

代码

class Solution {
public:
    int countAsterisks(string s) {
        int num = 0;//计算|数目并且每次对2取余数
        int n = s.size();
        int sum = 0;
        for(int i = 0;i < n;i++){
            if(s[i] == '|'){
                num ++;
                num %= 2;
            }
            else if(s[i]=='*' &amp;&amp; num == 0){
                sum ++;
            }
        }
        return sum;
    }
};

459重复的子字符串

解题思路

代码

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        //i是每次试探的字母的个数。
        //注意在for循环中两个分号之间加的条一旦满足就会立刻退出循环,本题最好将这个条件放在if条件判断中
        for(int i = 1; i <= n/2 /*&amp;&amp; n % i == 0*/;i++){
            if(n % i == 0){
                bool match = true;
                for(int j = i;j < n;j++)
                    if(s[j] != s[j - i]){
                        match = false;
                        break;
                    }
                if(match)
                    return true;
            }
            
        }
        return false;
    }
};

1790仅执行一次字符串交换能否使两个字符串相等

解题思路

首先我们看到这道题就要想明白,究竟什么时候才可以最多一次交换,即可得到两个相同的字符串。
下面注释中是分析思路

代码

class Solution {
public:
    bool areAlmostEqual(string s1, string s2) {
        /*
            1.如果s1 == s2那么返回true
            2.s1 != s2{
                最多有两处不同 &amp;&amp; 这两处的字符倒过来相同(即a1 == b2. a2 == b1)
            }        
        */
        if(s1.size()!=s2.size()) return false;
        if(s1 == s2)return true;
        if(s1 != s2) {
            int c1,c2;int num = 0;
            for(int i = 0;i < s1.size(); i ++){
                if(s1[i] != s2[i]){
                    num++;
                    if(num == 1){
                        c1 = i;
                    }else if(num == 2){
                        c2 = i;
                    }else{
                        return false;
                    }
                }
            }
            //因为返回true的情况较少,所以就单独讨论是否返回true,其余直接返回false;
            if(num == 2 &amp;&amp; s1[c1] == s2[c2] &amp;&amp; s1[c2] == s2[c1]){
                return true;
            }
        }
        return false;
    }
};

1961检查字符串是否为数组前缀

解题思路

遇到这道题很容易就知道要一边遍历words数组,一边遍历s,进行比较;
其中2,3是提交出错才反应过来的。
在遍历期间,我们需要考虑可能出现的几种情况:{
1.在遍历words的某个字符串期间,j的大小达到了最大
2.在刚遍历完words的某个字符串时,恰好,j的大小也达到了s.size();
发生2时,就是正确匹配,即返回true时。
3.(也就是2的某一种情况)words刚全遍历完,s也恰巧全遍历完,那么退出循环,返回true;
4.遍历中出现字符不匹配,返回false;
}
所以只有2发生,才会返回true;
收获:哈哈哈,原来string.size(),vector<>.size(),甚至,words[i].size()都是可以的!!

代码

class Solution {
public:
    bool isPrefixString(string s, vector<string>&amp; words) {
        /*
            1.在words大循环下,依次遍历s和words[i]的字符串,需要两个指针。
        */
        //2.如果在words这个数组在切换时,s到头了,则可以判定,满足条件。跳出循环,返回true;
        int j = 0;
        //假设 words的数组全长大于s的长度
        for(int i = 0;i< words.size() &amp;&amp; j <s.size();i++){
            for(int m = 0;m < words[i].size();m++,j++){
                if(j>=s.size())return false;//遍历到words的某个字符串中间,但s却到头了,则返回false;
                if(words[i][m] != s[j])
                    return false;
            }
        }
        //3.如果从第一个循环中跳出来,但是j还没有遍历到头,则说明s的长度大于words的所有字符串的长度之和,
        //所以一定会返回false;
        if(j<s.size())return false;
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值