【七月集训】day02 字符串

2315. 统计星号

题目描述:

给你一个字符串 s ,每 两个 连续竖线 '|' 为 一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。

请你返回 不在 竖线对之间,s 中 '*' 的数目。

注意,每个竖线 '|' 都会 恰好 属于一个对。

思路:

1、先统计 | 的数量cnt,数量为偶数则开始统计 * 的数量ans;

class Solution {
public:
    int countAsterisks(string s) {
        int cnt = 0;
        int ans = 0;
        for (auto c:s) {
            if (c == '|') {
                cnt ++;
            } else if ( c == '*' && !(cnt%2)) {
                ans ++;
            }
        }
        return ans;
    }
};

​​​​​459. 重复的子字符串

题目描述:

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

思路:

1、先判断子串str的长度是否可以构成字符串s,即s.size()是否是str.size()的整数倍n;

2、然后判断字符串s是否可以由子串构成,即遍历字符串s,查看s的第i个元素是否与str的第i%n个元素相等

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;
    }
};

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

题目描述:

给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。

如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。

思路:

1、字符串长度不相等,两个字符串就不可能相等

2、统计字符串中字符不相等的下标,当下标等于2时,进行这两个字符交换,判断是否交换后字符串是否相等,不相等则返回false;相等则返回true;

3、需要注意的是,当两个字符串不需要交换就相等的时候,即字符不相等的下标为0的时候,也要返回true;

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;
    }
};

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

题目描述:

给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 。

字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的前 k(k 为 正数 )个字符串按顺序相连得到,且 k 不超过 words.length 。

如果 s 是 words 的 前缀字符串 ,返回 true ;否则,返回 false 。

思路:

用一个字符串substr记录words中出现的字符串,当字符串substr和要比对的字符串相等时,则返回true;否则返回false;

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;
    }
};

猜你喜欢

转载自blog.csdn.net/ilovejujube/article/details/125568438