算法day_5 字符串处理专题

server/2024/12/28 2:47:42/

碎碎念

这是我在2024年12月21日的算法练习,加油!

题目一:不常见单词查找

884. 两句话中的不常见单词

题目描述

给定两个句子 s1s2,找出仅在其中一个句子中出现一次的单词。也就是说,这些单词在两个句子中只出现过一次,并且只出现在其中一个句子中。

示例

示例 1:

输入: s1 = "this apple is sweet", s2 = "this apple is sour"
输出: ["sweet","sour"]

示例 2:

输入: s1 = "apple apple", s2 = "banana"
输出: ["banana"]

解题思路

  1. 字符串分割

    • 使用 C++ 的 istringstream 进行字符串分割,根据 C++ Reference 文档,这是处理空格分隔字符串的标准方法。
    • istringstream 会自动跳过空格,逐个读取单词。
    • 通过将两个句子分开处理,可以准确统计每个单词的总出现次数。
  2. 词频统计

    • 使用 unordered_map 记录每个单词的出现次数。
    • 遍历两个句子中的所有单词,并在哈希表中更新对应单词的计数。
    • 时间复杂度为 O(n),其中 n 为总单词数。
    • 空间复杂度为 O(m),其中 m 为不重复单词数。
  3. 结果筛选

    • 遍历哈希表,筛选出出现次数为 1 的单词,这些单词即为仅在一个句子中出现过的单词。

完整代码实现

#include <vector>
#include <string>
#include <unordered_map>
#include <sstream>using namespace std;class Solution {
public:vector<string> uncommonFromSentences(string s1, string s2) {unordered_map<string, int> wordsCount; // 哈希表用于记录单词频率string word;vector<string> result;// Lambda 函数用于处理字符串分割和词频统计auto helper = [&](const string& s) {istringstream iss(s);while (iss >> word) {wordsCount[word]++;}};helper(s1); // 处理第一个句子helper(s2); // 处理第二个句子// 筛选出只出现一次的单词for (const auto& [key, value] : wordsCount) {if (value == 1) {result.emplace_back(key);}}return result;}
};
代码解析
  • unordered_map<string, int> wordsCount: 用于存储每个单词及其出现次数。
  • helper Lambda 函数: 负责将输入的句子进行分割,并更新哈希表中的单词计数。
  • 遍历哈希表: 通过遍历哈希表中的键值对,筛选出出现次数为 1 的单词,并将其添加到结果向量中。

时间复杂度分析

  • 字符串分割: 每个句子都需要 O(n) 的时间进行分割。
  • 词频统计: 由于使用了哈希表,插入和查找操作的平均时间复杂度为 O(1),总的词频统计时间复杂度为 O(n)。
  • 结果筛选: 遍历哈希表,时间复杂度为 O(m)。

总体时间复杂度为 O(n),其中 n 是两个句子中单词的总数。

题目二:字符串压缩

面试题 01.06. 字符串压缩

题目描述

实现一个方法,将连续重复的字符进行压缩。对于每一组连续重复的字符,替换成字符后跟其出现的次数。如果压缩后的字符串没有变短,则返回原始字符串。

示例

示例 1:

输入:"aabcccccaaa"
输出:"a2b1c5a3"

示例 2:

输入:"abc"
输出:"abc"

解题思路

使用双指针技巧解决该问题:

  1. 指针设计

    • i 指针:标记当前处理字符的起始位置。
    • j 指针:向后搜索相同字符的结束位置。
    • 区间 [i, j) 表示连续相同字符段。
  2. 压缩规则

    • 记录每段相同字符的首字符和出现次数。
    • 当压缩后字符串更短时返回压缩后的字符串,否则返回原字符串。
    • 时间复杂度为 O(n),其中 n 是字符串的长度。
    • 空间复杂度为 O(n),用于存储压缩后的字符串。
  3. 优化点

    • 预先计算压缩后的字符串长度,可以避免在不必要的情况下进行字符串拼接。
    • 使用 ostringstream 或者直接构造字符串以提升效率。

完整实现

#include <string>using namespace std;class Solution {
public:string compressString(string S) {int i = 0, j = 0;string result;while (i < S.size()) {// 移动 j 指针,找到当前字符段的结束位置while (j < S.size() && S[i] == S[j]) {j++;}// 记录当前字符及其出现次数result += S[i];result += to_string(j - i);i = j; // 更新 i 指针,开始处理下一个字符段}// 比较压缩后的字符串长度与原字符串的长度return result.size() < S.size() ? result : S;}
};
代码解析
  • 指针 ij: 用于标记当前正在处理的字符段的起始和结束位置。
  • 字符串拼接: 将当前字符和其出现次数拼接到结果字符串中。
  • 条件判断: 最后比较压缩后的字符串长度与原字符串长度,决定返回哪一个。

时间复杂度分析

  • 主循环: 每个字符最多被遍历两次(一次由 i 指针,一次由 j 指针),时间复杂度为 O(n)。
  • 字符串拼接: 在最坏情况下,每个字符都需要被拼接到结果字符串中,依然保持 O(n) 的时间复杂度。

总体时间复杂度为 O(n),空间复杂度为 O(n)。

进一步优化

  • 如果需要提高性能,可以考虑预分配足够的空间给 result 字符串,避免多次内存分配。
  • 在处理大量重复字符时,可以提前返回结果,减少不必要的计算。

总结

今天的两题也是非常简单的两题,主要考察了字符串处理的基本技巧。加油喔!

附加资源

  • C++ istringstream 使用指南
  • LeetCode 884. 两句话中的不常见单词 题解
  • LeetCode 面试题 01.06. 字符串压缩 解题思路
  • 双指针算法详解

http://www.ppmy.cn/server/153110.html

相关文章

【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802940.html?templateId1718516 【问题分类】功能使用 【关键字】pipelined 【问题描述】 Oracle PL/SQL中包含pipelined函数的对象迁移到YashanDB会出现不兼容现象。 【问题原因分…

MySQL什么情况下会导致索引失效

MySQL什么情况下会导致索引失效 索引&#xff08;Index&#xff09;是数据库中一种用于快速查找和访问表中数据的结构&#xff0c;它类似于书的目录&#xff0c;通过索引可以快速定位到目标数据&#xff0c;而无需遍历整个表&#xff0c;索引的存在可以显著提高查询速度&#x…

【产品更新】汇匠源保证金保函平台v2.0.23

汇匠源保证金保函平台 2.0&#xff0c;是汇匠源科技深耕行业需求的又一力作。该平台专为政府机构及企业量身打造&#xff0c;通过高度集成化的系统管理&#xff0c;实现对工资保证金从缴纳、管理到使用的全流程监控&#xff0c;确保每一笔资金都能精准到位&#xff0c;有效预防…

界面化管理Nginx的工具—NginxUI简介与搭建

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. NginxUI简介 1.1 NginxUI介绍 Nginx UI 是一个全新的 Nginx 网络管理界面&#xff0c;旨在简化 Nginx 服务器的管理和配置。…

Debian 10上使用UFW设置防火墙

介绍 UFW或Uncomplicated Firewall是iptables一个接口&#xff0c;旨在简化配置防火墙的过程。 虽然iptables是一个可靠而灵活的工具&#xff0c;但初学者很难学会如何使用它来正确配置防火墙。 如果您希望开始保护网络并且不确定使用哪种工具&#xff0c;UFW可能是您的正确选…

太速科技-428-基于XC7Z100+ADRV9009的双收双发无线电射频板卡

基于XC7Z100ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100ADRV9009的双收双发无线电射频板卡是基于Xilinx ZYNQ FPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡&#xff0c;用于5G小基站&#xff0c;无线图传&#xff0c;数据收发等领域。 二…

Unity开发哪里下载安卓Android-NDK-r21d,外加Android Studio打包实验

NDK下载方法&#xff08;是r21d,不是r21e, 不是abc, 是d版本呢) google的东西&#xff0c;居然是完全开源的 真的不是很多公司能做到&#xff0c;和那种伪搜索引擎是不同的 到底什么时候google才会开始造车 不过风险很多&#xff0c;最好不要合资&#xff0c;风险更大 Andr…

在 Go 中利用 ffmpeg 进行视频和音频处理

在 Go 中利用 ffmpeg 进行视频和音频处理 ffmpegutil 包概述主要功能介绍1. 视频格式转换2. 提取音频3. 获取视频信息4. 创建视频缩略图5. 提取随机帧无线程版本&#xff1a;多线程版本&#xff1a; 总结 ffmpeg 是一款功能强大的多媒体处理工具&#xff0c;支持视频和音频的编…