总结

CASE

1、回文

最长回文子串。

最多删除一个字符串 1.1.2

给定一个字符串判断有多少个回文串。(1.2)

回文对 (1.3)

2、运算

加1 (4.1)

求积

类加数

3、子序列

3、最长子串

知识点

1、字符串
2、 stringBuilder可以翻转

reverse();

3、Character

1 回文串

回文解释:以某个字符为中心的前缀和后缀都是相同的,例如以一段回文串“aba”为例,以b为中心,它的前缀和后缀都是相同。

1.1 判断是否回文

1.1.1  判断一个字符串是否为回文 (双指针)

1.1.2  删除一个字符串之后 (双指针)

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

输入: “aba”
输出: True
示例 2:

输入: “abca”
输出: True
解释: 你可以删除c字符。
链接:https://leetcode-cn.com/problems/valid-palindrome-ii

算法:

  • 在发现第一次不一致之后,分为两种情况。

1.1.3  验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

算法:通过StringBuilder.reverse判断。

1.2 最长回文串(中心拓展法)

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

算法:

  • 核心:一个回文子串一定是有轴心的。根据轴心计算回文字符串时需要区分奇偶两种情况。
  • STEP1 对于子串中每个字符作为轴心时,都可以计算一个最大回串。
  • STEP2 循环遍历一遍字符串就可以得到每个字符作为轴心时,最大子串了

注意:这里有个疑问,就是对于”aaaa”这样字符串,”aaaa”是在遍历[1]个节点时,得到。一个回文子串一定是有轴心的,只需要关注这个轴心的的回文串就可以。

1.3 回文子串个数(中心拓展法)

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。https://leetcode-cn.com/problems/palindromic-substrings/

思路:以 每个点 为轴心 进行判断是否有回文,包含奇数和偶数个数

1.4 回文对

给定一组 互不相同 的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。https://leetcode-cn.com/problems/palindrome-pairs/

思路:借助于map进行分组,考虑空字符串情况,空字符传需要和各个字符串拼接进行判断。

2 翻转

2.1 翻转单词

1、给定一个字符串,逐个翻转字符串中的每个单词。https://leetcode-cn.com/problems/reverse-words-in-a-string/

代码

2.2 翻转字符串

方法1  使用双向指针空间O(1)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string

 

3 字符串比较

3.1  最长公共前缀

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

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

链接:https://leetcode-cn.com/problems/longest-common-prefix/

算法:

3.2 子序列

3.2.1 判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。

示例 1:
s = “abc”, t = “ahbgdc”

返回 true.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-subsequence

算法

 

3.2.2 通过删除字母匹配到字典里最长单词

给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting

算法:

3.3 最长子串

3.3.1 无重复最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

算法:

 

3.4 累加数

累加数是一个字符串,组成它的数字可以形成累加序列。

一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。

给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/additive-number

算法思想:

  • 一个字符串,给定前两个数之后,判断是不是满足累加条件。check()
  • 穷举第一个数和第二数使用 check()判断是否为累加数。

4 运算

4.1 求和

4.1.1 加1

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

链接:https://leetcode-cn.com/problems/plus-one/

算法:

  • 陷阱:只加1,不是每位加1。
  • 加1之后,需要判断是否继续向下走

 

4.1.2 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

链接:https://leetcode-cn.com/problems/add-binary/

算法:

 

4.1.3 字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

链接:https://leetcode-cn.com/problems/add-strings/

算法:

4.2 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

链接:https://leetcode-cn.com/problems/multiply-strings/

算法:

WX20200913-211236

4.3 两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

链接:https://leetcode-cn.com/problems/divide-two-integers/

算法:

 

4.4 数字和字符串转换

给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”(”Gold Medal”, “Silver Medal”, “Bronze Medal”)。

(注:分数越高的选手,排名越靠前。)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/relative-ranks

代码:

 

5 字符串匹配

5.1 实现strStr()

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr

算法: 使用单词移动,比较字符串

 

6 字符串统计

6.1 字符串中单词个数

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string/

算法:

 

分类&标签