算法记录

本文深入探讨了Python程序员面试中常见的算法题目,包括字符串排列、最长公共子串、字符串反转等,提供了递归与非递归解决方案,以及利用动态规划、空间换时间等技巧解决实际问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为个人记性比较差,看了什么东西有时候一下子就忘了,所以打算写一个博客来记录一下看过的东西,本篇博客主要是《python 程序员面试算法宝典》 中的内容,希望自己以后能够多温习一下,打牢基础。

第5章 字符串

1. 如何求一个字符串中的所有排列 (输入字符abc,输出a、b、c能够排列出来的所有字符串)

第一种方法:递归法。思路:固定第一个字符,对后面两个字符b c进行全排列;然后交换第一个字符与后面的字符,将剩下的字符进行全排列;将上一次交换的字符交换回来,再交换另外的字符...

代码:定义一个Permutation(str,start) 函数,当start == len(str) -1 时,表示全排列已经完成,可以输出当前排列的字符串。其中 i = start,先交换[swap(str, start, i)], 再调用[Permutation(str,start+1)], 再还原[swap(str, start, i)]

第二种方法:非递归法。思路:先将字符串按升序排序,然后寻找大于当前字符串的最小字符串。步骤:(1)按升序排列,(2)找出第一个下降的字符,(3)与后面比它大的最小字符交换,(4)对后面的字符串逆序。

代码:定义swap(i,j)函数,Reverse(str,begin,end)函数[交换字符串个数], getNextPermutation(str)函数[先找第一个下降的字符,再找比它大的,swap再Reverse]

扩展:如何去掉重复的排列-- 从第一个字符起分别与他非重复的字符交换,在递归的方法上只要加一个判断字符是否重复的函数

2. 如何求两个字符串的最长公共字串 ('abccade' 和 'dgcadde' 的最长公共字串为 'cad')

动态规划法:定义一个二元函数f(i,j),表示分别以s1[i],s2[j]结尾的公共字串的长度,f(0,j) = 0, f(i,0) = 0, [f(i+1,j+1) = 0 如果 str[i+1] !=  str2[i+1], f(i+1,j+1) = f(i,j) + 1 如果 str[i+1] =  str2[i+1]]

3. 如何对字符串进行反转

将字符串转化成字符数组,定义两个索引分别指向数组的首和尾,交换索引的值,并将索引朝中间移动

4. 如何判断两个字符是不是换位字符 ('aaaabbc' 和 'abcbaaa' 是由相同的字符组成)

空间换时间:申请一个256的数组,遍历第一个数组,将字符对应的ASCII码作为数组下标,对应数组的元素加一。对应第二个数组,如果找到下标,将数组的值减一。如果最后数组的值都为0,那么就是换位字符

5.如何判断两个字符的包含关系 (s1 = 'abcdef', s2 = 'acf', s1包含s2)

空间换时间:定义一个flag数组,记录较短字符串中字符出现的情况,如果出现,标记为1,同时记录flag中1的个数count。再遍历较长的字符串,对应的字符串,如果flag==1,则使其变为0,如果flag==0,那么就保持不变。最后再次统计count的个数。

6.如何对由大小写字母组成的字符数组排序 (小写字母在前,大写字母在后,不要求顺序)

定义两个指针,一个指向头,一个指向尾,如果头指针发现大写字母,尾指针发现小写字母,交换,二者往中间靠拢

7.如何消除字符串的内嵌括号 (对字符串(1,(2,3),(4,(5,6,),7)) 去除括号)

两个功能,1.判断括号是否匹配,2.消除括号。 定义一个count,遇见左括号,count+1,遇到右括号,count-1。注意最前面的括号不能省略,判断是不是数字,如果是就提取出来。

8. 判断是不是整数 (判断字符串是不是整数,如果是返回值)

整数包括正数和负数,其中正数有两种写法‘123’ 和 ‘+123’,负数只有一种写法,‘-123’. 书中提出了两种方法

第一种: 递归法:对于整数而言,123可以看作 12*10+3,12又可以看作1*10+2,-123可以看作(-12)*10-3, (-1)*10-2。先判断是正数还是负数,再从右往左遍历,判断最后一个数字是不是数字。

代码:c1 == '-' ? toint(c1c2c3...cn-1)*10 - (cn - '0') : toint(c1c2c3...cn-1)*10 + (cn - '0')

第二种:非递归法:首先通过第一个字符判断符号位,然后将符号位去掉,将后面的看作正数来处理,例如:‘123’,遍历到1时,结果为1,遍历到2时,结果为1*10+2 = 12, 遍历到3时,结果为12*10+3 = 123 

代码:res = res*10 + ord(list(strs)[i]) - ord('0')

9.如何实现字符串的匹配

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值