算法字符串篇

237 阅读5分钟

整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−2^31, 2^31− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

示例

输入:-123

返回值:-321

输入:120

返回值:21

解题思路

将需要反转的整数转化成字符串,然后使用内置函数去除负号和零。使用切片[::-1]对字符串进行反转即可。

注:Python中符合切片并且常用的有:列表,字符串,元组。格式:[开头:结束:步长] 开头:当步长>0时,不写默认0。当步长<0时,不写默认-1 ;结束:当步长>0时,不写默认列表长度加一;当步长<0时,不写默认负的列表长度减一 步长:默认1,>0 是从左往右走,<0是从右往左走

def reverse(number):
	if number == 0: return 0
	number = str(number)
	reverse_num = ''
	if number[0] == '-':
		reverse_num += '-'
	reverse_num += number[::-1].lstrip('0').rstrip('-')
	reverse_num = int(reverse_num)
	if -2**31 < reverse_num < 2**31-1:
		return reverse_num
	return 0
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

括号序列

题目描述

给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[]{}"都是合法的括号序列,但"(]"和"([)]"不合法。

示例

输入:"["

返回值:false

输入:"[]"

返回值:true

解题思路

循环判断字符串中是否有符合条件的对括号,如果有则使用replace函数替换为空,直至字符串没有满足条件的对扩号。此时如果字符串为空,则返回true,否则返回false

def isValid(s):
	while '()' in s or '[]' in s or '{}' in s:
		s = s.replace('()', '')
		s = s.replace('[]', '')
		s = s.replace('{}', '')
	return s == ''
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

最后一个单词的长度

题目描述

给定一个仅包含大小写字母和空格' '的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。

示例

输入:"Hello World"

返回值:5

解题思路

使用strip函数去除首尾的空字符,然后使用split函数以空格为分割符对字符串进行切片取最后一个字符串并返回其长度

def lengthofLastWord(s):
	s = s.strip(' ')
	n = s.split(' ')[-1]
	return len(n)
  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

实现strStr()

题目描述

实现strStr()函数。

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

当needle是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当needle是空字符串时我们应当返回 0 。这与C语言的strstr()以及 Java的indexOf()定义相符。

示例

输入:haystack = "hello", needle = "ll"

返回值:2

输入: haystack = "aaaaa", needle = "bba" 输出: -1

解题思路

思路一:使用find函数
def strStr(haystack, needle):
	return haystack.find(needle)
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
思路二:

通过needle的长度,直接在haystack里面循环比较

def strStr(haystack, needle):
	i = 0
	if needle == '': return 0
	while i <= len(haystack)-len(needle):
		if haystack[i:i+len(needle)] == needle:
			return i
		i+=1
	return -1
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

最长公共前缀

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例

输入:["flower","flow","flight"]

返回值:"fl"

解题思路

python中字符串是可以比较大小的,max返回字符串中最大的字符串,min返回最小的。按照ascII值排,字符串也好,列表也好,都是可迭代对象。先比较两个对象的第0个元素,大小关系即为对象的大小关系,如果相等则继续比较后续元素,先终止迭代的认为是小的。举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀

def longestCommonPrefix(strs):
	if not strs: return ""
	s1 = min(strs)
	s2 = max(strs)
	for i, x in enumerate(s1):
		if x != s2[i]:
			return s2[:i]
	return s1
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

删除字符串a中包含的字符串b

题目描述

写一段程序,删除字符串a中包含的字符串b

示例

输入:a = "asdw",b = "sd"

返回值:“aw”

解题思路

i循环a字符串,j循环b字符串,判断从第i个字符开始包不包含b,如果包含返回True,如果不包含返回False。如果为Ture,则i=i+len(b)/即跳过b的长度;如果False,则将a[i]放入result中。

def delBString(a, b):
	if not isinstance(a, str):
		raise TypeError("a is not str")
	if not isinstance(b, str):
		raise TypeError("b is not str")	
	if len(a) < len(b):
		raise Exception('a length must large to b length')
	result = []
	flag = False
	i = 0
	la = len(a)
	lb = len(b)
	while i < la:
		j = 0
		#判断a从第i个字符开始包不包含b,如果不包含返回False,包含返回True
		while j < lb:
			if i+j < la and a[i+j] == b[j]:
				j += 1
			else:
				j += 1
				flag = False
				break
			flag = True
		#如果包含b,直接把从i开始跳过b字符串的长度
		if flag:
			i += lb
		#如果不包含,把第i位的字符增加到列表中
		else:
			result.append(a[i])
			i += 1
	return "".join(result)
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(n)