数据结构与算法实例详解--字符串、模拟篇

举报
Xxy_1008 发表于 2024/07/26 12:19:18 2024/07/26
【摘要】 提升了对字符串处理问题的解决能力,学会根据具体需求分析和设计算法。 增强了逻辑思维,能够清晰地考虑各种可能的情况,并通过代码准确实现。 更加熟悉函数的定义和使用,将复杂问题分解为小的函数模块,提高代码的可读性和可维护性。 对边界情况的处理有了更深入的理解,如字符串长度较短的情况。

字符串处理是数据结构与算法中的一个重要主题,涉及对字符串的存储、操作和处理。模拟算法通常指在某种具体情境下的步骤、过程和操作的模拟。这里,我们将讨论字符串相关的问题以及如何使用模拟算法来解决它们。

字符串的基本概念

  1. 字符串定义:字符串是字符的序列,通常用于表示文本数据。在计算机中,字符串可以用字符数组或字符指针来表示。

  2. 常见操作

    • 遍历:访问字符串中的每一个字符。
    • 连接(Concatenation):将两个字符串合并成一个字符串。
    • 切片(Slicing):提取字符串的部分内容。
    • 查找(Searching):在字符串中查找特定的字符或子字符串。
    • 替换(Replacing):将字符串中的某些字符或子字符串替换为其他内容。

字符串算法

  • 字符串匹配算法:如暴力匹配算法、KMP算法、Boyer-Moore算法等,用于查找一个字符串是否为另一个字符串的子串。

  • 字符串排序:对字符串进行排序的算法,比如字典序排序。

  • 哈希算法应用:通过哈希表快速查找和匹配字符串。

模拟算法

模拟算法主要是根据某种规则或条件模拟整个过程。这种算法通常不需要复杂的数据结构,而是直接在逻辑上实现具体的操作。以下是一些基于字符串的模拟算法示例:

  1. 括号匹配

    • 使用栈结构模拟括号的匹配过程。遍历字符串,对于每个字符,如果是左括号就压入栈中,右括号就弹出栈中的元素,最后检查栈是否为空。
  2. 字符串反转

    • 通过遍历字符串,将元素从后向前放入新的结果字符串中。
  3. 计算字符串中字符的频率

    • 用一个数组(或字典)来模拟字符的频率统计,遍历字符串并更新相应的频率。

ok,话不多说,我们直接上真题:

520.检测大写字母【简单】
题目:
我们定义,在以下情况时,单词的大写用法是正确的:

全部字母都是大写,比如 "USA" 。
单词中所有字母都不是大写,比如 "leetcode" 。
如果单词不只含有一个字母,只有首字母大写, 比如 "Google" 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。

示例 1:

输入:word = "USA"
输出:true
示例 2:

输入:word = "FlaG"
输出:false
提示:

1 <= word.length <= 100
word 由小写和大写英文字母组成
分析问题:
        两个思路,第一个思路是模拟,模拟题目判断条件,走三次循环,时间复杂度相比于其他方法有点高,但是通俗易懂,最容易想到这种方法。具体思路就是写三个判断函数,每一个函数对应每一个判断条件,然后最后用 or 将他们连接起来,只要有一个正确则返回True,全部错误返回False。

        第二个思路,一遍过。只需要进行一次循环,一次循环里面同时判断三个条件,这样可以大大节约时间。


代码实现:

思路1:
class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        def pan(s:str):
            for j in s:
                if j.islower(): return False
            else: return True
        def le(s:str):
            for i in s:
                if i.isupper():return False
            return True
        def lp(s:str):
            if len(s)>1 and s[0].isupper():
                for k in s[1:]:
                    if k.isupper(): return False
                return True
            return False
        if pan(word) or le(word) or lp(word): return True
        return False

思路2:
class Solution:
    def detectCapitalUse(self, word: str) -> bool:
        n = len(word)
        if len(word)>=2:
            if word[0].isupper():
                cnt = 0
                for char in word:
                    if char.isupper():
                        cnt += 1
                if cnt == n or cnt == 1:
                    return True
            elif word[0].islower():
                cnt = 0
                for char in word:
                    if char.islower():
                        cnt += 1
                if cnt == n:
                    return True
        else:
            return True
        return False

总结:
        两段代码目标一样,第一段代码侧重于解题时间短,很容易想出来;第二段代码侧重于时间复杂度低,代码高效,也不是很难想出来。两段代码各有千秋。

思路1详解:
方法内部定义了三个辅助函数:

pan 函数用于判断字符串中的所有字符是否均为大写。
le 函数用于判断字符串中的所有字符是否均为小写。
lp 函数用于判断字符串首字母大写,其余字母均为小写的情况。
        最后,通过判断输入的字符串 word 是否符合上述三种规则中的任意一种,如果符合则返回 True,否则返回 False 。

思路2详解:
首先,获取字符串 word 的长度 n ,并判断长度是否大于等于 2 。

如果长度大于等于 2 且首字符大写:

计算字符串中大写字符的个数 cnt 。
若 cnt 等于字符串长度(全大写)或 cnt 等于 1(首字母大写),则返回 True 。
如果长度大于等于 2 且首字符小写:

计算字符串中小写字符的个数 cnt 。
若 cnt 等于字符串长度(全小写),则返回 True 。
如果字符串长度小于 2 ,则直接返回 True 。

如果以上条件都不满足,返回 False 

考点:

对字符串的遍历操作,熟悉如何逐个处理字符串中的字符。
字符串方法的运用,如 isupper() 和 islower() 来判断字符的大小写。
条件判断和逻辑推理,根据不同的情况制定判断规则。
收获:

提升了对字符串处理问题的解决能力,学会根据具体需求分析和设计算法。
增强了逻辑思维,能够清晰地考虑各种可能的情况,并通过代码准确实现。
更加熟悉函数的定义和使用,将复杂问题分解为小的函数模块,提高代码的可读性和可维护性。
对边界情况的处理有了更深入的理解,如字符串长度较短的情况。


“黄沙百战穿金甲,不破楼兰终不还。”——《从军行七首·其四》

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。