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

你可能感兴趣的:(leetcode探索初级算法之字符串)