微网站网站模板建站,wordpress 海量数据,网站后台上传文字图片,微商怎么做_和淘宝网站一样吗?文章目录LeetCode 高频“字符串操作”题通关#xff1a;3道题教你玩转字符处理一、 最长回文子串#xff08;LeetCode 5#xff0c;中等#xff09;—— 中心扩展法的高效应用题目痛点题目回顾常规思路的局限性优化技巧#xff1a;中心扩展法完整代码实现思维提炼二、 字符…文章目录LeetCode 高频“字符串操作”题通关3道题教你玩转字符处理一、 最长回文子串LeetCode 5中等—— 中心扩展法的高效应用题目痛点题目回顾常规思路的局限性优化技巧中心扩展法完整代码实现思维提炼二、 字符串相乘LeetCode 43中等—— 模拟竖式乘法的细节把控题目痛点题目回顾常规思路的死胡同优化技巧模拟竖式乘法完整代码实现思维提炼三、 翻转字符串里的单词LeetCode 151中等—— 双指针的高效处理题目痛点题目回顾常规思路的局限性优化技巧双指针原地翻转完整代码实现思维提炼总结字符串题的解题通用心法LeetCode 高频“字符串操作”题通关3道题教你玩转字符处理 你好呀我是 山顶风景独好 字符串题是算法面试的“常客”看似简单实则暗藏诸多细节陷阱——比如字符编码、边界越界、效率优化等。很多人写字符串处理代码要么漏洞百出要么效率低下。本文精选3道高频字符串题拆解“常规思路→优化技巧→细节把控”的全过程帮你练就字符串处理的“硬核能力”。一、 最长回文子串LeetCode 5中等—— 中心扩展法的高效应用题目痛点这道题的暴力思路是“枚举所有子串判断是否回文”但时间复杂度高达O ( n 3 ) O(n^3)O(n3)完全无法通过中等规模的测试用例而动态规划解法虽然能将时间复杂度降至O ( n 2 ) O(n^2)O(n2)但空间复杂度也达到了O ( n 2 ) O(n^2)O(n2)。中心扩展法则能在O ( n 2 ) O(n^2)O(n2)时间、O ( 1 ) O(1)O(1)空间内解决问题是性价比最高的解法。题目回顾给你一个字符串s找到s中最长的回文子串。示例输入s babad→ 输出bab或aba输入s cbbd→ 输出bb。常规思路的局限性暴力枚举枚举所有子串的起始和结束索引判断是否回文。枚举子串的时间是O ( n 2 ) O(n^2)O(n2)判断回文的时间是O ( n ) O(n)O(n)总时间复杂度O ( n 3 ) O(n^3)O(n3)。动态规划定义dp[i][j]表示子串s[i..j]是否为回文串。状态转移方程为d p [ i ] [ j ] ( s [ i ] s [ j ] ) a n d d p [ i 1 ] [ j − 1 ] dp[i][j] (s[i] s[j]) \quad and \quad dp[i1][j-1]dp[i][j](s[i]s[j])anddp[i1][j−1]边界条件dp[i][i] true单个字符是回文dp[i][i1] (s[i] s[i1])两个相同字符是回文。这种方法的空间复杂度为O ( n 2 ) O(n^2)O(n2)当n1e3时内存占用就会超标。优化技巧中心扩展法核心洞察回文串的本质是对称性——每个回文串都有一个“中心”可以是一个字符对应奇数长度回文如aba的中心是b也可以是两个字符之间的间隙对应偶数长度回文如abba的中心是两个b之间。基于这个洞察算法思路如下遍历字符串中的每个字符分别以该字符为奇数长度回文的中心向左右扩展记录最长回文子串遍历字符串中的每对相邻字符以它们之间的间隙为偶数长度回文的中心向左右扩展记录最长回文子串最终取所有扩展结果中的最大值。完整代码实现deflongestPalindrome(s:str)-str:nlen(s)ifn2:returns start,max_len0,1# 最长回文子串的起始索引和长度defexpand(left:int,right:int)-tuple[int,int]: 从中心向左右扩展返回回文子串的起始索引和长度 whileleft0andrightnands[left]s[right]:left-1right1# 退出循环时s[left] ! s[right]所以有效长度是 right-left-1returnleft1,right-left-1foriinrange(n):# 奇数长度回文中心是s[i]l1,len1expand(i,i)# 偶数长度回文中心是s[i]和s[i1]之间l2,len2expand(i,i1)# 更新最长回文子串信息current_maxmax(len1,len2)ifcurrent_maxmax_len:max_lencurrent_max startl1iflen1len2elsel2returns[start:startmax_len]# 测试用例print(longestPalindrome(babad))# 输出 bab 或 abaprint(longestPalindrome(cbbd))# 输出 bbprint(longestPalindrome(a))# 输出 a思维提炼处理回文串问题时优先考虑中心扩展法——相比动态规划它省去了O ( n 2 ) O(n^2)O(n2)的空间开销相比暴力枚举它的时间效率更高。同时要注意区分奇数和偶数长度的回文中心避免遗漏情况。二、 字符串相乘LeetCode 43中等—— 模拟竖式乘法的细节把控题目痛点这道题的常规思路是“转整数相乘再转回字符串”但当字符串长度超过 20 时整数就会溢出而模拟竖式乘法时又容易在进位处理和结果拼接上出错。核心难点是“如何用字符串精准模拟人工乘法的每一步”。题目回顾给定两个以字符串形式表示的非负整数num1和num2返回num1和num2的乘积它们的乘积也表示为字符串形式。注意不能使用任何内置的 BigInteger 库或常规的行之有效的常规思路的死胡同直接将num1和num2转为整数相乘defmultiply_naive(num1:str,num2:str)-str:returnstr(int(num1)*int(num2))这种方法在num1或num2长度超过 20 时会因整数溢出而失效完全不符合题目要求。优化技巧模拟竖式乘法核心洞察人工计算乘法的步骤是“逐位相乘→错位相加→处理进位”我们可以用数组模拟这个过程结果长度分析两个长度分别为m和n的数相乘结果的长度最多为m n如99 * 99 9801长度 224。因此我们可以初始化一个长度为m n的数组res存储中间结果。逐位相乘遍历num1的每一位从后往前和num2的每一位从后往前计算乘积将结果加到res[i j 1]的位置i和j分别是两个数的当前位索引。处理进位从后往前遍历res数组将每位的数值对 10 取余得到当前位除以 10 得到进位加到前一位。结果拼接去除res数组开头的零转为字符串若结果全零则返回0。完整代码实现defmultiply(num1:str,num2:str)-str:ifnum10ornum20:return0m,nlen(num1),len(num2)# 初始化结果数组长度为mn初始值为0res[0]*(mn)# 从后往前遍历num1和num2的每一位foriinrange(m-1,-1,-1):digit1int(num1[i])forjinrange(n-1,-1,-1):digit2int(num2[j])# 乘积加到对应位置res[ij1]digit1*digit2# 处理进位forkinrange(mn-1,0,-1):carryres[k]//10res[k-1]carry res[k]res[k]%10# 去除开头的零start0whilestartmnandres[start]0:start1# 转为字符串return.join(map(str,res[start:]))# 测试用例print(multiply(2,3))# 输出 6print(multiply(123,456))# 输出 56088print(multiply(0,12345))# 输出 0思维提炼处理大数相乘问题时必须用模拟竖式乘法的方法避免整数溢出。核心是“用数组存储中间结果”并注意三个细节乘积的位置对应关系res[ij1]进位的处理顺序从后往前结果前导零的去除。三、 翻转字符串里的单词LeetCode 151中等—— 双指针的高效处理题目痛点这道题的常规思路是“split 分割→反转列表→join 拼接”但题目往往会附加限制条件如“不允许使用额外空间”“字符串首尾和中间有多个空格”此时常规方法就会失效。核心难点是“在原字符串上高效处理空格和翻转”。题目回顾给你一个字符串s逐个翻转字符串中的每个单词。单词是由非空格字符组成的字符串s中可能包含前导空格、尾随空格和单词间的多个空格。返回的结果字符串中单词间只能用单个空格分隔且不包含任何额外空格。示例输入s the sky is blue→ 输出blue is sky the输入s hello world → 输出world hello。常规思路的局限性用 Python 内置函数处理defreverseWords_naive(s:str)-str:return .join(reversed(s.split()))这种方法虽然简洁但不符合“不允许使用额外空间”的进阶要求且无法体现算法能力。优化技巧双指针原地翻转核心洞察要在O ( 1 ) O(1)O(1)额外空间内解决问题Python 中字符串不可变需转为列表可以分三步去除多余空格用双指针法将字符串中的多余空格前导、尾随、中间多个去除只保留单词间的单个空格翻转整个字符串将整个字符串的字符顺序反转翻转每个单词遍历字符串找到每个单词的边界将每个单词单独反转。完整代码实现defreverseWords(s:str)-str:# 转为列表方便原地修改charslist(s)nlen(chars)# 步骤1去除多余空格slow0forfastinrange(n):# 跳过空格ifchars[fast] :continue# 单词间添加单个空格ifslow!0:chars[slow] slow1# 复制当前单词的字符whilefastnandchars[fast]! :chars[slow]chars[fast]slow1fast1# 此时slow是去除多余空格后的字符串长度charschars[:slow]mlen(chars)# 步骤2翻转整个字符串defreverse(left:int,right:int):whileleftright:chars[left],chars[right]chars[right],chars[left]left1right-1reverse(0,m-1)# 步骤3翻转每个单词start0foriinrange(m):ifchars[i] :reverse(start,i-1)starti1# 翻转最后一个单词reverse(start,m-1)return.join(chars)# 测试用例print(reverseWords(the sky is blue))# 输出 blue is sky theprint(reverseWords( hello world ))# 输出 world helloprint(reverseWords(a good example))# 输出 example good a思维提炼处理字符串翻转、去空格等问题时双指针法是首选——它能在O ( n ) O(n)O(n)时间、O ( 1 ) O(1)O(1)额外空间内完成操作。同时“先整体翻转再局部翻转”的技巧是解决“单词翻转”类问题的通用套路。总结字符串题的解题通用心法回文问题选中心扩展避免动态规划的空间开销精准利用回文的对称性大数问题选模拟竖式杜绝整数溢出逐位处理进位和拼接翻转去空格选双指针实现原地操作兼顾时间和空间效率。字符串题的本质是细节把控——字符的索引、空格的处理、进位的计算每一个细节都可能导致代码出错。只有掌握了底层的处理技巧才能应对各种附加限制条件写出高效且严谨的代码。 更多字符串算法题解析欢迎到我的CSDN主页交流山顶风景独好✨ 如果你遇到“字符串处理无从下手”的算法题随时告诉我一起拆解解题思路