leetcode探索初级算法之字符串

1. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

# 反转字符串
# 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

# 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

# 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。


class Solution:
    def reverseString(self, s) -> None:
        s[:] = s[::-1]

2. 整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

# 整数反转
# 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
# 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。


class Solution:
    def reverse(self, x: int) -> int:
        # 如果数字在-10到10的范围,直接返回原数字
        if -10 < x < 10:
            return x
        if x > 0:
            # 如果 x 为正数。直接反转
            x = int(str(x)[::-1])
        else:
            # 如果 x 为负数。去掉负号再反转
            x = - int(str(x)[:0:-1])
        # 判断是否溢出数字范围
        return x if -2 ** 31 < x < 2 ** 31 - 1 else 0

3. 字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

# 字符串中的第一个唯一字符
# 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。


import collections


class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 使用Python中自带的collections.Counter模块
        count = collections.Counter(s)
        # 遍历字符串
        for i in range(0, len(s)):
            # 如果出现次数为1,返回索引
            if count[s[i]] == 1:
                return i
        return -1

4. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

# 有效的字母异位词
# 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
import collections


class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 使用Python中自带的collections.Counter模块
        count1 = collections.Counter(s)
        count2 = collections.Counter(t)
        if count1 == count2:
            return True
        else:
            return False

5. 验证回文字符串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

# 验证回文字符串
# 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
import re


class Solution:
    def isPalindrome(self, s: str) -> bool:
        # 使用正则表达式,只要数字字符和字母,并小写
        s = ''.join(re.findall('[a-zA-Z0-9]', s)).lower()
        # 第一种解决方法,直接判断是否等于转置字符串
        # return s == s[::-1]
        # 第二种解决方法
        # 使用两个游标
        h, t = 0, len(s) - 1
        # 只要头游标小于尾游标
        while h <= t:
            if s[h] == s[t]:
                h += 1
                t -= 1
            else:
                return False
        return True

6. 字符串转换整数 (atoi)

本题中的空白字符只包括空格字符 ' ' 。
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

# 字符串转换整数 (atoi)
# 本题中的空白字符只包括空格字符 ' ' 。
# 假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,请返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。


class Solution:
    def myAtoi(self, str: str) -> int:
        s = str.strip()
        if not len(s):
            return 0
        if s[0] not in ["+", "-"] and not s[0].isdigit():
            return 0
        res = s[0]
        for value in s[1:]:
            if not value.isdigit():
                break
            res += value
        if res == '+' or res == '-':
            return 0
        res = int(res)
        if res < -2 ** 31:
            return -2 ** 31
        elif res > 2 ** 31 - 1:
            return 2 ** 31 - 1
        else:
            return res

7. 实现 strStr() 函数

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
当 needle 是空字符串时我们应当返回 0 。

# 实现 strStr() 函数。
# 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。
# 当 needle 是空字符串时我们应当返回 0 。

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        # 如果needle是空字符串,返回0
        if needle == '':
            return 0
        m, n = len(haystack), len(needle)
        for i in range(m - n + 1):
            if haystack[i:i + n] == needle:
                return i
        else:
            return -1

8. 外观数列

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1.1
2.11
3.21
4.1211
5.111221
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。

# 外观数列
# 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
#
# 1.     1
# 2.     11
# 3.     21
# 4.     1211
# 5.     111221
# 1 被读作  "one 1"  ("一个一") , 即 11。
# 11 被读作 "two 1s" ("两个一"), 即 21。
# 21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211。
#
# 给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
#
# 注意:整数序列中的每一项将表示为一个字符串。


class Solution:
    def countAndSay(self, n: int) -> str:
        res = "1"
        for i in range(n - 1):
            res = self.getNext(res)
        return res

    def getNext(self, res):
        index, next_seq = 0, ""
        while index < len(res):
            count = 1
            while index < len(res) - 1 and res[index] == res[index + 1]:
                count += 1
                index += 1
            next_seq += str(count) + res[index]
            index += 1

        return next_seq

9. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

# 最长公共前缀
# 编写一个函数来查找字符串数组中的最长公共前缀。
#
# 如果不存在公共前缀,返回空字符串 ""。


class Solution:
    def longestCommonPrefix(self, strs):
        # 如果长度为0 ,返回空字符串
        if len(strs) == 0:
            return ''
        # 如果长度为1,返回第一个元素
        if len(strs) == 1:
            return strs[0]
        # 只需判断最长和最短的字符号串
        a = min(strs)
        b = max(strs)
        # 遍历最短的字符串
        for i in range(len(a)):
            if a[i] != b[i]:
                return a[:i]
        return a
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354