【基础算法训练】—— 字符串

简介: 【基础算法训练】—— 字符串

第一题 500. 键盘行


好家伙,我读成 了键盘侠…。本题的将字母映射为行号的想法可以浅积累一下


题目描述

微信图片_20221019184802.png

解题报告


① 首先进行预处理吧,获取每个英文字母所在的行,比如字母a在第一行,字母b在第二行,有点打表的思想吧。解题区看到一个纯打表的佬,浅记录一下。

微信图片_20221019184856.jpg

② 获得到当前准备遍历的字符串的首字母所在的行号,用它作为比较的参考,将符合条件的字符串统计起来


参考代码(C++版本)

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        //预处理,获取每个英文字母所在的行
        string rowIndex = "12210111011122000010020202";
        vector<string>ans;
        //取出字符数组中的每个字符串
        for(auto &word : words)
        {
            //在统一转换为小写字母的情况下,获取首字母所在的行号
            char index = rowIndex[tolower(word[0])-'a'];
            //遍历当前这个字符串
            bool flag = true;
            for(int i = 1; i < word.size();i++)
                if(rowIndex[tolower(word[i])-'a'] != index)
                {
                    flag = false;
                    break;
                } 
            if(flag) ans.push_back(word);
        }
        return ans;
    }
};

第二题 1160. 拼写单词


使用映射的思想处理字符串,使用数组模拟哈希表来统计个数


题目描述微信图片_20221019185011.png

解题报告


看到数据范围是1000。我想直接暴力的,但是发现写了三个for循环,默默放弃了自己的念想,可能可以优化吧~

常规的解法了,是将字母表中有的字母通过减去字符a来实现映射,将映射的结果使用一个数组来统计。


比如这个数组叫做nums,此时这个数组了,其实是模拟的一个哈希表,比如说将字符c映射成2了,此时数组中索引为2的数据num[2]就是字符c,因为数组是一块内存空间,最终是要落实到存储一个数据的,比如存储的是4,那么就代表字符c出现了四次。

按照上述的思想,我们只是需要将本题的字母表chars和词汇表words分别这种处理,要能够凑数相应词汇的前提要求就是,对于某个词汇而言,组成这个词汇的每个字母的数量必须小于等于单词表中对应的字母的数量,不然就凑不出来。


参考代码(C++版本)

class Solution {
public:
    int countCharacters(vector<string>& words, string chars) {
        //三重暴力超时
        int ans = 0;//统计符合要求的字符串的长度
        int cnt_chars[26];
        memset(cnt_chars,0,sizeof(cnt_chars));
        for(char c: chars) ++cnt_chars[c-'a'];//进行一步映射,统计字母表中有的字母的个数
        int cnt_word[26];//这个数组统计的是当前处理的字符串中的字母的个数
        for(string word : words)
        {
            //每次使用前需要置零
            memset(cnt_word,0,sizeof (cnt_word));
            for(char c:word) ++cnt_word[c-'a'];
            bool flag = true;
            for(int i = 0;i < 26;i++)
                //如果说词汇中出现的字母的数目比字母表中多,那就是组成不了
                if(cnt_word[i] > cnt_chars[i]) 
                {
                    flag = false;
                    break;
                }
            //符合要求的字符串,统计答案
            if(flag) ans += word.size();
        }
        return ans;
    }
};

第三题 1047. 删除字符串中的所有相邻重复项


栈的思想


题目描述

微信图片_20221019190256.png

解题报告

微信图片_20221019190333.jpg

参考代码(C++版本)

class Solution {
public:
    string removeDuplicates(string s) {
        string stk;
        int len = s.size();
        for(int i = 0;i < len;i++ )
        {
            //倘若此时栈不空,而且栈顶等于要进栈的元素,就把栈顶弹出
            if(!stk.empty() && stk.back() == s[i])
                stk.pop_back();
            else stk.push_back(s[i]);
        }
        return stk;
    }
};

第四题 1935. 可以输入的最大单词数


题目描述

微信图片_20221019190511.png


解题报告


这个也是可以使用哈希表来统计的,用哈希表统计键位坏了的字符。算是一步预处理吧,再去遍历现有的单词,假如遇到了哈希表中统计的字符,就可以判定是无法使用键盘完全输入的单词了。


参考代码(C++版本)

class Solution {
public:
    int canBeTypedWords(string text, string brokenLetters) {
        //这个也是可以使用哈希表的思想来做的
        int m[26];
        //brokenLetters 由 互不相同 的小写英文字母组成
        memset(m,0,sizeof(m));
        for(auto ch : brokenLetters) m[ch-'a']++;
        bool flag = true;
        int ans = 0;
        int len = text.size();
        //注意字符数组的结尾是\0
        for(int i = 0; i <= len;i++)
        {
            //遍历结束,或者遍历到空格了,统计答案
            if(text[i] == ' ' || text[i] == '\0')
            {
                //统计结果
                if(flag)  ans ++;
                //重置之前因为故障被修改过的flag
                flag = true;
            } 
            else if(m[text[i] - 'a'])//如果遇到键位是坏的字符了
                flag = false;
        }
        return ans;
    }
};

总结


就今天的题而言了,很多时候直接处理字符串了,可能不太方便,

但是咱可以通过当前字符 - 字符a来实现映射

相关文章
|
11天前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
181 1
|
13天前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
17天前
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
31 2
|
20天前
|
分布式计算 算法 Java
阿里云ODPS PySpark任务使用mmlspark/synapseml运行LightGBM进行Boosting算法的高效训练与推理
阿里云ODPS PySpark任务使用mmlspark/synapseml运行LightGBM进行Boosting算法的高效训练与推理
|
1月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
1月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
19天前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集
|
21天前
|
算法 Java
Java数据结构与算法:字符串匹配算法之暴力匹配
Java数据结构与算法:字符串匹配算法之暴力匹配
|
21天前
|
算法 Java
Java数据结构与算法:字符串匹配算法之KMP算法
Java数据结构与算法:字符串匹配算法之KMP算法
|
1月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串