字符串系列问题

分割回文串

回文串系列的一个通用解法是动态规划,在是否需要输出回文串分割内容的不同要求下,写法也不同。

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]

class Solution:def partition(self, s: str) -> List[List[str]]:length = len(s)dp = [[False] * length for _ in range(length)]for i in range(length):for j in range(i + 1):if s[i] == s[j] and (i - j <= 2 or dp[j + 1][i - 1]):dp[j][i] = Trueresult = []def helper(index,temp):if index == length:result.append(temp)returnfor i in range(index,length):if dp[index][i]:helper(i + 1,temp + [s[index:i + 1]])helper(0,[])return result

这种问题就是注意分清楚回溯的边界就好啦。

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
示例:
输入: "aab"
输出: 1
解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

class Solution:def minCut(self, s: str) -> int:n = len(s)min_s = list(range(n))dp = [[False] * n for _ in range(n)]for i in range(n):for j in range(i + 1):if s[i] == s[j] and (i - j <= 2 or dp[j + 1][i - 1]):dp[j][i] = Trueif j == 0:min_s[i] = 0else:min_s[i] = min(min_s[i],min_s[j - 1] + 1)return min_s[-1]

不需要得到具体的分割方案时,只要记录每个节点对应的分割次数即可。

单词拆分

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。
说明:
分隔时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
输出:
[
"cats and dog",
"cat sand dog"
]
示例 2:
输入:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
输出:
[
"pine apple pen apple",
"pineapple pen apple",
"pine applepen apple"
]
解释: 注意你可以重复使用字典中的单词。
示例 3:
输入:
s = "catsandog"
wordDict = ["cats", "dog", "sand", "and", "cat"]
输出:
[]

注意记忆化递归的写法。

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:if not wordDict:return []minLength,maxLength,length = len(wordDict[0]),len(wordDict[0]),len(s)wordDict = set(wordDict)for word in wordDict:minLength = min(minLength,len(word))maxLength = max(maxLength,len(word))def helper(index):if not index in lookup:result = []for i in range(minLength,min(maxLength,length - index) + 1):word = s[index:index + i]if word in wordDict:temp = [word + " " + j for j in helper(index + i)]result.extend(temp)lookup[index] = resultreturn lookup[index]lookup = {length:[""]}helper(0)return [i[:-1] for i in lookup[0]]

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。
示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

同样只要记录每个字母位置的拆分次数即可。

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:""":type s: str:type wordDict: List[str]:rtype: bool"""breakp = [0]length = len(s)for i in range(length + 1):for j in breakp:if s[j:i] in wordDict:breakp.append(i)breakreturn breakp[-1] == len(s)

leetcode阶段总结——分割字符串类型相关推荐

  1. leetcode系列-131.分割字符串

    leetcode系列–第131题.分割字符串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案.回文串 是正着读和反着读都一样的字符串. 输入:s ...

  2. 图解LeetCode——1422. 分割字符串的最大得分(难度:简单)

    一.题目 给你一个由若干 0 和 1 组成的字符串 s ,请你计算并返回将该字符串分割成两个 非空 子字符串(即 左 子字符串和 右 子字符串)所能获得的最大得分. 「分割字符串的得分」为 左 子字符 ...

  3. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解

    5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...

  4. php字符串类型讲解

    PHP 支持八种原始类型(type). 四种标量类型: string(字符串) integer(整型) float(浮点型,也作 double ) boolean(布尔型) 两种复合类型: array ...

  5. python json字符串类型的value换行方案

    按照标准json语法,字符串类型的value是不能换行写的. 例如,以下是错误的写法 {"key":"helloworld" } 但是遇到了需要在json中写代 ...

  6. python基础教程:数值与字符串类型

    Python3 中有六个标准的数据类型:Number(数字).String(字符串).List(列表).Tuple(元组).Sets(集合).Dictionary(字典). 不可变数据(四个):Num ...

  7. 题库练习2(随机数去重排序、分割字符串、进制转换)

    1. 随机数去重排序 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉 ...

  8. php和mysql两种不同方式的分割字符串和类型转换

    一.sql语句1.分割字符串方法:substring_index(字符串,'分隔符',正数从左数起几位/负数从右数起几位); 例如:subtring_index('aa_bb_cc_dd','_',1 ...

  9. 字符串类型str方法

    首字母大写 temp = 'rttty' ret = temp.capitalize() print(ret) =================================== 内容居中 tem ...

最新文章

  1. Github上的十大机器学习项目
  2. springboot获取sessionid_Spring Boot 整合Redis, 用起来真简单!
  3. springboot 2.0.5配置Druid连接池和web监控后台
  4. ASP.NET Core微服务(四)——【静态vue使用axios解析接口】
  5. 重温.NET下Assembly的加载过程
  6. T-SQL编程基础之三:游标(Cursor)编程
  7. “约见”面试官系列之常见面试题第十八篇之深拷贝和浅拷贝得区别(建议收藏)
  8. 计算机如何添加管理员权限,电脑使用代码如何添加管理员权限
  9. Json解析工具Jackson(使用注解)
  10. 基础编程题目集 6-7 统计某类完全平方数 (20 分)
  11. Shell脚本:Linux Shell脚本学习指南(超详细)
  12. fckeditor for java_基于java使用FCKeditor
  13. 前端工程师必备的ps技巧 — 切图
  14. 企业微信第三方服务商和钉钉ISV开发对比
  15. python 处理英文步骤
  16. java tld 方法重载_java 中的TLD文件
  17. 【Unity入门教程】 第八章 人工智能【中国大学MOOC游戏引擎原理及应用】
  18. 视觉slam中的一种单目稠密建图方法
  19. 分布式系统开发实战:分布式存储,分布式存储常用技术
  20. 又涨了!2021 年 5 月程序员工资统计新鲜出炉,网友:还是Java程序员牛逼~

热门文章

  1. linux mysql命令行导入_在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)...
  2. 杀手皇后 JoJo奇妙冒险 漫画人物3d模型
  3. 诚之和:Python数据科学使用numpy求行均值
  4. 自动化脚本测试代码参考
  5. Hexo 博客快速整合公众号导流工具,不用互推也能实现粉丝躺增!
  6. lammps案例:fix indent命令实现纳米摩擦及摩擦力计算
  7. 【20保研】北京航空航天大学网络空间安全学院 “2019年暑期优秀大学生夏令营”活动通知...
  8. nyoj 541 最强DE 战斗力
  9. Aseprite入门教程
  10. 儒家、儒学、儒教之三个不同的概念