LeetCode 1455 - 1458

检查单词是否为句中其他单词的前缀

给出一个句子,句子是由若干个单词组成的,每个单词之间用 1 个空格隔开,检查给定的单词是 句子中 哪个单词的前缀

单词的下标从 1 开始,输出单词的编号

如果给定单词是多个单词的前缀,输出第一个是前缀的编号

如果这个单词不是句子中任何一个单词的前缀就输出 -1,表示无解

示例1:给出四个单词,给定单词 burg 是 第四个单词 burger 的前缀,输出 4

示例2:pro 是第 1 个 problem 和第 2 个 problem 的前缀,输出第 1 个 problem 的编号

示例3:you 不是任何一个单词的前缀,输出 -1

从前往后枚举句子中的所有的单词,判断当前枚举的单词是不是以给定单词为前缀的

①如何把字符串中的每个单词拿出来(找出所有的单词)

iostream:从标准输入输出中读入读出

fstream:从文件中读入读出

stringstream:从字符串中读入读出

②如何判断当前单词是否是某个单词的前缀(判断字符串 A 是不是字符串 B 的前缀)

substr():返回 B 的某一个子串,想判断 A 是不是 B 的前缀,只需要判断 B.substr()从 0 开始的长度是 size 的字符串是不是等于 A

B.substr(0,A.size()) == A

substr() 如果 searchWord 长度超过给定串 word 的长度不会报错,会取到最后一个字符截止,有几个取几个

word == 4,searchWord == 5,只会取四个字符

class Solution {
public:
    int isPrefixOfWord(string sentence, string searchWord) {
        //定义 stringstream 用 sentence 初始化
        stringstream ssin(sentence);

        string word;
        //每次从 stringstream 中读出一个字符串
        for(int i = 1;ssin >> word;i++ ) {
            //判断 searchWord 是不是当前 Word 的前缀
            if(word.substr(0,searchWord.size()) == searchWord) {
                return i;
            }
        }
        return -1;
    }
};

定长子串中元音的最大数目

给出一个字符串 s 和整数 k

在字符串中找到所有长度是 k 的子串,在所有长度为 k 的子串当中哪个子串包含的元音字母数量最多,输出最大个数

示例1:k = 3,看一下所有长度是 3 的子串,看一下哪个子串中包含的元音字母数量最多

a b c i i i d e f

a b c 1

b c i  1

c  i i  2

i  i  i  3

i  i d  2

i d e  2

d e f 1

不能暴力求解:不能先枚举所有子串,再扫描这个子串中有多少个元音字母,时间复杂度为 O( n^k ) 10^10,时间复杂度应该控制在 10^8 内

动态维护区间:一开始维护区间 abc 里面的元音数量是 1,每次把整个区间往后移动一格,其实就是把下一个字母加进来(把 i 加进来,把 a 删去). . .

每次往后移动一格,最多只会加一个字母,只会删一个字母,每移动一次需要的操作都是 O( 1 ),就可以用线性的方法把每一个区间中的元音字母数量统计出来

C++:unordered_set的count_百步送剑的博客-CSDN博客_unordered_set的count

class Solution {
public:
    int maxVowels(string s, int k) {
        //定义 res 表示最大值
        int res = 0;
        //开一个哈希表存储所有的元音-> 用于判断每个字符是不是元音
        unordered_set<char> S({'a','e','i','o','u'});
        //从前往后扫描所有的字符串 cnt用于动态记录有多少个元音字母
        for(int i = 0,cnt = 0;i< s.size();i++ ) {
            //如果元素存在于容器中,则此函数返回1,否则返回0
            cnt += S.count(s[i]);
            //表示当前已经把前 k 个字母加进来了-> i 每次向后移动一个后一定要把最前面一个删掉
            if(i >= k)  cnt -= S.count(s[i - k]);
            //表示已经有 k 个数了-> 更新答案 0 ~ k - 1表示区间中已经包含 k 个数  
            if(i >= k - 1) res = max(res,cnt);
        }
        return res;
    }
};

二叉树中的伪回文路径 

给出一个二叉树,二叉树的每个节点都有一个权值,权值为 1 ~ 9

二叉树的一条路径是伪回文的,满足路径上的所有数,如果存在一种给它重新排序的方式,使得它变成回文串

2  2  2  2  1

2  2  1  2  2

把能够通过调整变成回文的串称为伪回文串,只需要判断伪回文串中每个字符出现的次数是奇数还是偶数,如果没有任何一个字符出现的次数是奇数,或者只有一个字符出现的次数是奇数,就是伪回文,如果有两个以上(包括两个)字符出现的次数是奇数,那么这两个字符一定不能对应起来,如果只有一个的字符的话,可以把它放在中间

如果一个串是伪回文串,等价于最多只有一个字符出现的次数是奇数

伪回文串是对应树从根节点到叶节点的路径来说的,判断从根节点到叶节点的路径中,有多少条路径是伪回文串( DFS ),只需要把所有从根节点到叶节点的路径遍历一遍,依次判断每条路径是不是回文串即可

示例1:有 3 个叶节点,所以有 3 条从根到叶节点的路径

              2  3  3→ 3  2  3,所以 233 是 一 个伪回文串

              2  3  1,不是伪回文串

              2  1  1→1  2  1,所以 211 是 一 个伪回文串

由于 一 共有 2 个伪回文串,所以返回 2

数据范围(节点数量)为1 ~ 10^5 之间,时间复杂度要控制在 O( n ),最多为 O( nlogn )

①节点数量 ≥ 1,树不为空

②每个节点的权值是 1 ~ 9

DFS遍历,遍历过程中每次记录所有从根节点到叶节点的路径,统计 1 ~ 9 每个数出现的次数(开一个长度为 10 的数组),单独判断每条路径是否满足条件,如果满足条件答案 + 1

c++ 里面的map容器的迭代器first、second用法_漂过的博客-CSDN博客_c++ map second

关联容器:unordered_map详细介绍(附可运行代码)_weixin_30448685的博客-CSDN博客

遍历二叉树,当遍历到叶节点的时候,判断数组中是否存在两个奇数数字个数就可以了,当判断结束后或者递归结束后,将计数恢复成原始状态,避免对后面产生影响

因为一个回文路径只能有一个或 0 个奇数的数字个数,比如101只有1个奇数数字个数(1个0),11只有0个奇数数字个数(0个0),12因为有2个奇数数字个数(1个1,1个2),怎么排列都不是回文数,所以不是伪回文路径

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {  
public:
    //哈希表用于统计 1 ~ 9 每个数出现多少次
    unordered_map<int,int> cnt;
    int pseudoPalindromicPaths (TreeNode* root) {
        //每次递归前先把当前节点的值存在哈希表中
        cnt[root->val] ++;
        //判断是不是叶子节点-> 当前节点没有左子树并且没有右子树
        if(!root->left && !root->right) {
            //记录符合要求的路径数
            int t = 0;
            //统计当前的路径上,值为奇数的个数 如果为奇数的个数 > 1 那么一定不能组成回文串
            for(auto item : cnt)
                if(item.second % 2)
                    t++;
            //返回之前需要回溯-> 当前值-- 意味着回到当前节点的父节点
            cnt[root->val] --;
            //t<=1 返回1 t>1 返回0
            return t <= 1;
        }
        int res = 0;
        //遍历左右子树
        if(root->left) res += pseudoPalindromicPaths(root->left);
        if(root->right) res += pseudoPalindromicPaths(root->right);
        //恢复
        cnt[root->val] --;
        return res;
    }
};

两个子序列的最大点积

 

 

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qiuqiuyaq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值