Leetcode刷题——字符串部分题目汇总(二)

233 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

1447. 最简分数

题目

给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。

示例 1:

输入:n = 2 输出:["1/2"] 解释:"1/2" 是唯一一个分母小于等于 2 的最简分数。

示例 2:

输入:n = 3 输出:["1/2","1/3","2/3"]

示例 3:

输入:n = 4 输出:["1/2","1/3","1/4","2/3","3/4"] 解释:"2/4" 不是最简分数,因为它可以化简为 "1/2" 。

示例 4:

输入:n = 1 输出:[]

提示:

1 <= n <= 100

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/si…

分析

要求最简,说明分子和分母最大公约数为1。同时要注意数字和字符串的转换关系

代码

class Solution {
public:
    int gcd(int a, int b){
        if(a % b==0){
            return b;
        }
        return gcd(b, a % b);
    }
    vector<string> simplifiedFractions(int n) {
        vector<string> ans;
        for(int i=2; i <= n; i++){
            for(int j=1; j < i; j++){
                if(gcd(i, j) > 1){
                    continue;
                }
                string ch1="", ch2 = "";
                int n=j;
                while(n){
                    char ch = n % 10 + '0';
                    n /= 10;
                    ch1 = ch + ch1; 
                }
                n=i;
                while(n){
                    char ch = n % 10 + '0';
                    n /= 10;
                    ch2 = ch + ch2; 
                }
                string tmp = "";
                tmp += ch1;
                tmp += '/';
                tmp += ch2;
                ans.push_back(tmp);
            }
        }
        return ans;
    }
};

2000. 反转单词前缀

题目

给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。

例如,如果 word = "abcdefd" 且 ch = "d" ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 "dcbaefd" 。 返回 结果字符串 。

示例 1:

输入:word = "abcdefd", ch = "d" 输出:"dcbaefd" 解释:"d" 第一次出现在下标 3 。 反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "dcbaefd" 。

示例 2:

输入:word = "xyxzxe", ch = "z" 输出:"zxyxxe" 解释:"z" 第一次也是唯一一次出现是在下标 3 。 反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "zxyxxe" 。

示例 3:

输入:word = "abcd", ch = "z" 输出:"abcd" 解释:"z" 不存在于 word 中。 无需执行反转操作,结果字符串是 "abcd" 。

提示:

1 <= word.length <= 250 word 由小写英文字母组成 ch 是一个小写英文字母

来源:力扣(LeetCode)

链接:leetcode-cn.com/problems/re…

代码

查找并反转即可

class Solution {
public:
    string reversePrefix(string word, char ch) {
        string ans="";
        for(int i=0; i < word.size(); i++){
            ans = word[i] + ans;
            if(ch == word[i]){
                return ans + word.substr(i+1, word.size()-i-1);
            }
        }
        return word;
    }
};

2047. 句子中的有效单词数

题目

句子仅由小写字母('a' 到 'z')、数字('0' 到 '9')、连字符('-')、标点符号('!'、'.' 和 ',')以及空格(' ')组成。每个句子可以根据空格分解成 一个或者多个 token ,这些 token 之间由一个或者多个空格 ' ' 分隔。

如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:

仅由小写字母、连字符和/或标点(不含数字)。 至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。 至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。 这里给出几个有效单词的例子:"a-b."、"afad"、"ba-c"、"a!" 和 "!" 。

给你一个字符串 sentence ,请你找出并返回 sentence 中 有效单词的数目 。

示例 1:

输入:sentence = "cat and  dog"
输出:3
解释:句子中的有效单词是 "cat""and""dog"

示例 2:

输入:sentence = "!this  1-s b8d!"
输出:0
解释:句子中没有有效单词
"!this" 不是有效单词,因为它以一个标点开头
"1-s""b8d" 也不是有效单词,因为它们都包含数字

示例 3:

输入:sentence = "alice and  bob are playing stone-game10"
输出:5
解释:句子中的有效单词是 "alice""and""bob""are""playing"
"stone-game10" 不是有效单词,因为它含有数字

示例 4:

输入:sentence = "he bought 2 pencils, 3 erasers, and 1  pencil-sharpener."
输出:6
解释:句子中的有效单词是 "he""bought""pencils,""erasers,""and""pencil-sharpener."

提示:

1 <= sentence.length <= 1000
sentence 由小写英文字母、数字(0-9)、以及字符(' ''-''!''.'',')组成
句子中至少有 1 个 token

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/nu…

代码

class Solution {
public:
    bool isValid(const string_view &word) {
        int n = word.length();
        bool has_hyphens = false;
        for (int i = 0; i < n; i++) {
            if (word[i] >= '0' && word[i] <= '9') {
                return false;
            } else if (word[i] == '-') {
                if (has_hyphens == true || i == 0 || i == n - 1 || !islower(word[i - 1]) || !islower(word[i + 1])) {
                    return false;
                }
                has_hyphens = true;
            } else if (word[i] == '!' || word[i] == '.' || word[i] == ',') {
                if (i != n - 1) {
                    return false;
                }
            }
        }
        return true;
    }

    int countValidWords(string sentence) {
        stringstream ss(sentence);
        string s;
        int cnt=0;
        while(ss>>s){
            if(isValid(s)){
                cnt++;
            }
        }
        return cnt;
    }
};